Apache Beam JavaからRunInferenceでscikit-learnの処理を呼び出す
概要
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のコードとしては、以下の部分に定義されたもののようである。
- これを
RunInference
というtransformで実行している。
- 今回、pythonやBeam Python SDKのインストールは明示的には行わなかったが、ログを見ると
py-3.9-beam-2.43.0
と出てくるので、インストールされていることが前提となっている模様だ。
追記(2022-11-22)
上記でも出てくるDataflowパイプラインジョブの登録のmvnコマンドで、GCP_REGION
環境変数が参照されておらず、us-central1
を指定した状態になっていたので、PRを送ったところマージされた。
さらに追記(2022-11-26)
もう1件PRがマージされた。Beamのウェブサイトの誤植・不具合をGitHubのPRで報告できることが今回分かったので、今後も何か見つけたらやっていこう。
Discussion