Microsoftがキュレートしたイメージを使う他に、自分で作った勝手イメージを使うことができる。
今回は、勝手イメージを作ってHelloWorldしてみる。
AzureML上で動作するDockerイメージがMustで提供すべきもの
AzureML上で動作するDockerイメージは以下を提供する必要がある。
カスタム Dockerfile を使用する (省略可能)
- Ubuntu 18.04 以上
- Conda 4.7.# 以上
- Python 3.6 以上
- /bin/sh で入手可能な POSIX 準拠シェル
AnacondaとMiniconda
Python Software Foundationが運営するPythonパッケージ配布サービスであるPyPI。
pythonが使える環境からpipコマンドを使用してPyPIからパッケージをインストールする。
Condaは科学技術計算用パッケージのセットで、Python以外の何かも含む。
例えばプログラミング言語、パッケージ、統合開発環境、GUIなど。
そのため、PyPIではなくCondaが運営するパッケージシステムでパッケージを提供する。
pipではなくcondaコマンドを使用してパッケージをインストールする。
他のPythonパッケージ管理ツールと同様に、パッケージ管理ツールを併用することはできない…
ことになっているが、実際はcondaとpipをセットで使って必要なパッケージを揃えることになる。
Anacondaは、米Anaconda社が提供するPython/R言語用の配布。
Condaパッケージの全部入りで「Anacondaを入れておけば問題ない」と言われやすい。
全部入りで初期インストール時のサイズがとにかく大きい。
Anacondaリポジトリは2020年から商用利用が有償化されていて、もはや簡単には使えない。
Condaの必要最低限のセットがMiniconda。
Anacondaが有償である根拠となる条件に当てはまらないためMinicondaは商用でも無償。
必要なcondaパッケージをCLIで自力でインストールする必要がある。
ただ、そもそも”環境構築”とはそういうものなので、問題ない。
今回はMinicondaを使ってAzur MLが要求するConda環境を用意する。
Minicondaはこちら。
Dockerfile
Minicondaのリポジトリから選んでインストールする。
今回、Miniconda3-py39_4.9.2-Linux-x86_64 を選んだ。
conda,pipパッケージの依存関係管理をAzureMLに任せることができるが、
今回は自力で必要なconda、pipパッケージをインストールする。
(azureml-*にpandasは含まれるなど、以下だと少し冗長。)
ACRに入れて使うためログインユーザのパスワードを変更しておく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FROM ubuntu:18.04 LABEL description="miniconda3 Image" # Install Common Softwares RUN apt-get update && apt-get install -y \ build-essential \ bzip2 \ wget \ cmake \ git \ gcc \ make \ curl \ apt-transport-https && apt clean # Download Miniconda install RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh -O ~/Miniconda.sh && \ /bin/bash ~/Miniconda.sh -b -p ~/miniconda3 && \ rm ~/Miniconda.sh && \ echo ". ~/miniconda3/etc/profile.d/conda.sh" >> ~/.bashrc && \ echo "conda activate base" >> ~/.bashrc # Use bash as shell Shell ["/bin/bash","-i","-c"] # Install conda packages RUN conda install -y scikit-learn ipykernel matplotlib pandas scipy joblib # Install pip packages # azureml-train-automlは無茶苦茶重いので、Localで実行しないならazureml-train-automl-clientにする RUN pip install azureml-defaults azureml-train-automl-client # Change root Password RUN echo "root:Docker!" | chpasswd |
ビルドしてコンテナ内でバージョン確認してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ docker build -t hogehoge . ... $ docker run -it <image-id> root@xxx:/# python --version Python 3.9.1 root@xxx:/# conda --version conda 4.9.2 $ python --version root@xxx:/# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS" |
Azure MLの要件に合ったものが入った。
Azure Container Registry(ACR)に登録
作ったイメージをAzure Container Registryに登録してみる。
先にAzure PortalからACRのログインサーバURLを取得しておく。
例えば、zzzzzzz.azurecr.ioだったとする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# まず Azure にログインする # ブラウザが開き、認証をパスするとJSONが返ってくる。 # 以降、ターミナルでログイン情報が保持される。 $ az login A web browser has been opened at https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`. ... # 続いてターミナルでACRにログインする # nameオプションにACRのログインサーバURLを渡す $ az acr login --name zzzzzzz Login Succeeded # ACR用のタグをつけておく # イメージ名にはACRのログインサーバURLがないといけない。 $ docker tag hogehoge:v1 zzzzzzz.azurecr.io/hogehoge:v1 # ACRにpushする $ docker push zzzzzzz.azurecr.io/hogehoge:v1 $ ACRのリポジトリをリストする $ az acr repository list --name zzzzzzz --output table Result ------------------------------------------------ hogehoge |
ACRにpushできた。
カスタムイメージを使ったEnvironmentの登録
まず、カスタムイメージを使ったEnvironmentを登録する。
ちなみにAzureMLがカスタムイメージにアクセスするためにイメージのユーザ/パスワードを渡す。
今回、Dockerfile内でrootユーザのパスワードをDocker!とかにしてある。
実際は、Azure Key Vault(AKV)で管理すると良さそう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from azureml.core import Workspace from azureml.core import Environment # 新しい環境をWorkspaceに登録する ws = Workspace.from_config() new_environment = Environment("custom-image-env") new_environment.docker.base_image = "hogehoge" new_environment.docker.base_image_registry.address = "<acr_address>.azurecr.io" new_environment.docker.base_image_registry.username = 'root' new_environment.docker.base_image_registry.password = 'Docker!' new_environment.python.user_managed_dependencies = True new_environment.python.interpreter_path = "/root/miniconda3/bin/python" new_environment.register(ws) env = Environment.get(workspace=ws, name="custom-image-env") Environment(Name: custom-image-env,Version:1) |
登録できた。
新しい環境でテストスクリプトを実行する
CondaのHelloWorldをしてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from azureml.core import Workspace from azureml.core import Environment from azureml.core import Experiment from azureml.core import ScriptRunConfig from azureml.pipeline.core import PipelineParameter from azureml.data import OutputFileDatasetConfig import json source_directory = './' run_script_path = 'run.py' environment_name = "custom-image-env" compute_name = "aml-sample-compute" experiment_name = "custom-image-experiment" # カスタムイメージ用のワークスペースを取得 ws = Workspace.from_config() new_environment = Environment.get(workspace=ws,name=environment_name) # Run実行用の構成を作成する src = ScriptRunConfig( source_directory=source_directory, script=run_script_path, compute_target=ws.compute_targets[compute_name], environment=new_environment ) # Environment上でExperimentを実行する run = Experiment( workspace=ws, name=experiment_name ).submit(src) run.wait_for_completion(show_output=True) |
ちなみに、run.py は以下
1 2 3 |
import pandas as pd s1 = pd.Series([1,2,3,5]) print(s1) |
実行結果はstd_log.txtに出る。
1 2 3 4 5 6 7 8 |
0 1 1 2 2 3 3 5 dtype: int64 Cleaning up all outstanding Run operations, waiting 300.0 seconds 0 items cleaning up... Cleanup took 1.1920928955078125e-06 seconds |
カスタムコンテナにインストールしたpandasを使って出力された!
まとめ
Microsoftがキュレートするイメージではなく勝手イメージを作成し、
依存関係の解決を全て自力で行う方法を試してみた。
ベースイメージに対して pip や conda のパッケージを追加でインストールしないため高速。
パッケージ管理を AzureML から独立させることができるので見通しがよくなると思う。