kt.log

Resolve ImportError to use PyTorch Lightning on Azure Machine Learning Compute Instance

Azure Machine LearningCompute Instance には様々な Machine Learning / Deep Learning 用のライブラリがインストールされていますが、 ChainerPyTorch Lightning を利用する場合、シェルを使用して手動でインストールする必要があります。

このインストールは conda install pytorch-lightning -c conda-forge で完了させることができますが、 PyTorch Lightning のインポート時にエラーが発生します。本記事ではこの問題の解決方法を解説します。

問題

発生状況

  • Azure Machine Learning Compute Instance に PyTorch Lightning をインストール
    • Ubuntu 18.04.5 LTS
    • Anaconda
  • Jupyter で PyTorch Lightning を import
    • import pytorch_lightning as pl

エラー1

1
ImportError: /anaconda/envs/azureml_py38/lib/python3.8/site-packages/horovod/torch/mpi_lib_v2.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZNK2at6Tensor6deviceEv

horovod は、 TensorFlow, Keras, PyTorch, Apache MXNet 用の分散学習フレームワークです。
上記エラーは、 horovod.torch が使用する CPython の Shared Object の1つに、未定義のシンボルが存在するために発生しています。

解決手順

解決手順(エラー1)

horovod を再インストールします。その前段で、 GNU C Compiler と GNU C++ Compiler のアクティベーション・スクリプトをインストールします。

1
2
3
pip uninstall horovod
conda install gcc_linux-64 gxx_linux-64
conda run pip install --no-cache-dir horovod

エラー2

conda run pip install --no-cache-dir horovod が失敗します。エラーは以下の通りです。

1
ModuleNotFoundError: No module named '_sysconfigdata_x86_64_conda_linux_gnu'

この名前のライブラリが、少なくとも Python の Library path には存在しないということです。

解決手順(エラー2)

_sysconfigdata_x86_64_conda_linux_gnu を探して Python の Library path に配置し、その上で再度 horovod のインストールを行います。

1
2
sudo updatedb
locate _sysconfigdata_x86_64_conda_ | grep -v "__pycache__" | grep "azureml_py38"

updatedb は、ファイルシステム上のデータに関するデータベースを更新します。そのデータベースを使用する locate により、ファイル等を高速に検索することができます。
grep での絞り込みの際に指定している azureml_py38 は、エラー1を参考にしたものです。
上記 locate コマンドの出力は以下の通りです。

1
/anaconda/envs/azureml_py38/lib/python3.8/_sysconfigdata_x86_64_conda_cos6_linux_gnu.py

ModuleNotFoundError となっていたライブラリは、 Library path 上に異なる名前のファイルとして存在していました。これを horovod のインストール時に必要なファイル名で配置します。

1
2
3
4
EXISTING_PATH="/anaconda/envs/azureml_py38/lib/python3.8/_sysconfigdata_x86_64_conda_cos6_linux_gnu.py"
REQUIRED_PATH="/anaconda/envs/azureml_py38/lib/python3.8/_sysconfigdata_x86_64_conda_linux_gnu.py"

cp -p ${EXISTING_PATH} ${REQUIRED_PATH}

解説を見やすくするために冗長な記述をしました。実際には環境変数を使わずに cp の引数に直接指定する形で結構です。

解決手順(エラー1)(contd.)

上記が完了したら、再度 horovod をインストールします。

1
pip install --no-cache-dir horovod

今度は成功するはずです。

horovod の再インストールに成功したら、 Jupyter kernel を restart して完了です。

まとめ

Azure Machine Learning の Compute Instance で PyTorch Lightning を利用する際に直面するエラーの解決について解説しました。少し手間ですが、 PyTorch Lightning は実装の上で有用なライブラリですので、 Azure Machine Learning と併せて試してみてください。

See also