🥗

Apache Beam JavaからRunInferenceでscikit-learnの処理を呼び出す

2022/11/22に公開

概要

Apache Beam JavaからPythonの処理を呼び出す例について、以前に Apache Beam Java multi-language pipelines quickstart メモ - zennで試したが、2022/11/17にApache Beam 2.43.0がリリースされ、scikit-learnのMNISTの推論処理を呼び出す例がBeamのexampleに追加されていた(- An example for using Python RunInference from Java (#23290))。

以下では、このexampleについて実行し、https://github.com/kn1kn1/beam-examples/tree/master/multi-language-sklearn に最終的に動作したプロジェクトを格納した。

手順

基本的には、https://github.com/apache/beam/tree/master/examples/multi-language#sklearn-mnist-classification にあるとおりの手順である。

JavaとBeamのバージョンを指定し、mvn archetype:generateにより、exampleのmavenプロジェクトを新規作成する。

~
$ jenv local oracle64-11.0.16.1

~
$ export BEAM_VERSION=2.43.0

~
$ echo $BEAM_VERSION
2.43.0

~
$ mvn archetype:generate \
    -DarchetypeGroupId=org.apache.beam \
    -DarchetypeArtifactId=beam-sdks-java-maven-archetypes-examples \
    -DarchetypeVersion=$BEAM_VERSION \
    -DgroupId=org.example \
    -DartifactId=multi-language-beam \
    -Dversion="0.1" \
    -Dpackage=org.apache.beam.examples \
    -DinteractiveMode=false
[INFO] Scanning for projects...

:
(snip)
:


[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: beam-sdks-java-maven-archetypes-examples:2.43.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.example
[INFO] Parameter: artifactId, Value: multi-language-beam
[INFO] Parameter: version, Value: 0.1
[INFO] Parameter: package, Value: org.apache.beam.examples
[INFO] Parameter: packageInPathFormat, Value: org/apache/beam/examples
[INFO] Parameter: package, Value: org.apache.beam.examples
[INFO] Parameter: groupId, Value: org.example
[INFO] Parameter: artifactId, Value: multi-language-beam
[INFO] Parameter: targetPlatform, Value: 1.8
[INFO] Parameter: version, Value: 0.1
[INFO] Project created from Archetype in dir: /multi-language-beam
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.224 s
[INFO] Finished at: 2022-11-22T08:11:40+09:00
[INFO] ------------------------------------------------------------------------

~
$ 

作ったmavenプロジェクトに入り、以下のコマンドでDataflowジョブを登録する。

~
$ cd multi-language-beam 

~/multi-language-beam
$ jenv local oracle64-11.0.16.1

~/multi-language-beam
$ export GCP_PROJECT=<GCP project>
export GCP_BUCKET=<GCP bucket>
export GCP_REGION=<GCP region>

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.multilanguage.SklearnMnistClassification \
    -Dexec.args="--runner=DataflowRunner --project=$GCP_PROJECT \
                 --region=$GCP_REGION \
                 --gcpTempLocation=gs://$GCP_BUCKET/multi-language-beam/ \
                 --output=gs://$GCP_BUCKET/multi-language-beam/output" \
    -Pdataflow-runner
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/com/google/cloud/libraries-bom/26.1.3/libraries-bom-26.1.3.pom

:
(snip)
:

[INFO] 95 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:13 min
[INFO] Finished at: 2022-11-22T08:17:34+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project multi-language-beam: Compilation failure: Compilation failure: 
[ERROR] /multi-language-beam/src/main/java/org/apache/beam/examples/WordCount.java:[18,1] org.apache.beam.examplesにアクセスできません

:
(snip)
:

~/multi-language-beam
$ 

WordCount.javaなど今回使用ないソースコードでコンパイルエラーが発生しているので、不要なものを削除した。

https://github.com/kn1kn1/beam-examples/tree/master/multi-language-sklearn に最終的に動作したプロジェクトを格納した。

コンパイルが通るようにした状態で、再度mvnコマンドを実行する。

~/multi-language-beam
$ export GCP_PROJECT=<GCP project>
export GCP_BUCKET=<GCP bucket>
export GCP_REGION=<GCP region>

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.multilanguage.SklearnMnistClassification \
    -Dexec.args="--runner=DataflowRunner --project=$GCP_PROJECT \
                 --region=$GCP_REGION \
                 --gcpTempLocation=gs://$GCP_BUCKET/multi-language-beam/ \
                 --output=gs://$GCP_BUCKET/multi-language-beam/output" \
    -Pdataflow-runner
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.example:multi-language-beam >-------------------
[INFO] Building multi-language-beam 0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ multi-language-beam ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /multi-language-beam/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ multi-language-beam ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 16 source files to /multi-language-beam/target/classes
[INFO] 
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ multi-language-beam ---
11月 22, 2022 8:19:39 午前 org.apache.beam.runners.dataflow.options.DataflowPipelineOptions$StagingLocationFactory create
情報: No stagingLocation provided, falling back to gcpTempLocation
11月 22, 2022 8:19:39 午前 org.apache.beam.runners.dataflow.DataflowRunner fromOptions
情報: PipelineOptions.filesToStage was not specified. Defaulting to files from the classpath: will stage 257 files. Enable logging at DEBUG level to see which files will be staged.
11月 22, 2022 8:19:40 午前 org.apache.beam.sdk.extensions.python.transforms.RunInference inferExtraPackagesFromModelHandler
情報: Automatically inferred dependencies [scikit-learn, pandas] from the provided model handler.
11月 22, 2022 8:19:40 午前 org.apache.beam.sdk.extensions.python.PythonService start
情報: Running bootstrap command [python3, /var/folders/3s/6y2ls7zs7txf0wzf1p7ddhq00000gp/T/bootstrap_beam_venv9379698604696593328.py, --beam_version=2.43.0, --extra_packages=scikit-learn;pandas]
11月 22, 2022 8:19:43 午前 org.apache.beam.sdk.extensions.python.PythonService start
情報: Requirement already satisfied: pip in ~/.apache_beam/cache/venvs/py-3.9-beam-2.43.0-58fa10bd297d1d33d0540cdb3637e9da88210341/lib/python3.9/site-packages (21.2.3)

:
(snip)
:

11月 22, 2022 8:36:00 午前 org.apache.beam.runners.dataflow.DataflowPipelineJob logTerminalState
情報: Job 2022-11-21_15_23_21-10474618917274212526 finished with status DONE.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  16:25 min
[INFO] Finished at: 2022-11-22T08:36:00+09:00
[INFO] ------------------------------------------------------------------------

~/multi-language-beam
$ 

前回と同様に、起動してから最初のtransform(ReadLinesと書いてあるもの)が起動するまで5分以上掛かるので心配になるが、しばらく待つ。

最終的には、Dataflowのジョブとしては12分強、ビルド全体としては16分強掛かった。

その他気になったところ

  • 実行されるpythonのコードとしては、以下の部分に定義されたもののようである。

https://github.com/kn1kn1/beam-examples/blob/6de696825fda1669ab80b0d757a2c75c0e8532dc/multi-language-sklearn/src/main/java/org/apache/beam/examples/multilanguage/SklearnMnistClassification.java#L56-L60

  • これをRunInferenceというtransformで実行している。

https://github.com/kn1kn1/beam-examples/blob/6de696825fda1669ab80b0d757a2c75c0e8532dc/multi-language-sklearn/src/main/java/org/apache/beam/examples/multilanguage/SklearnMnistClassification.java#L117

  • 今回、pythonやBeam Python SDKのインストールは明示的には行わなかったが、ログを見るとpy-3.9-beam-2.43.0と出てくるので、インストールされていることが前提となっている模様だ。

追記(2022-11-22)

上記でも出てくるDataflowパイプラインジョブの登録のmvnコマンドで、GCP_REGION環境変数が参照されておらず、us-central1を指定した状態になっていたので、PRを送ったところマージされた。

https://github.com/apache/beam/pull/24302

さらに追記(2022-11-26)

もう1件PRがマージされた。Beamのウェブサイトの誤植・不具合をGitHubのPRで報告できることが今回分かったので、今後も何か見つけたらやっていこう。

https://github.com/apache/beam/pull/24345

GitHubで編集を提案

Discussion