MayaやMotionBuilderで提供されているpythonスクリプティング環境から,numpyやscipy,scikit-learnを利用するためのビルド手順を紹介します.
- 方針
- とりあえずMayaとMotionBuilderで動作させることを目指す
- Intel CompilerとMKLを活用する
- 可能な限り静的リンクすることで,DLL依存周りの面倒を解消する
- 結果としてpydファイルの肥大化には目をつぶる
- 開発・テスト環境
- Windows 10 Pro
- Maya 2016.6 x64
- MotionBuilder 2016.1 x64
- Visual Studio 2012 Professional Update 4
- Intel Parallel Studio XE 2017 Composer Edition for Fortran & C++ Windows 7.1
なお,今回のビルド作業では Intel compiler のVS2012向けビルド環境を利用しています.また,作業ディレクトリは「D:\Work\python」です.
1. 前準備
1.1. Pythonのセットアップ
Python 2.7.6 Release ページから「Windows X86-64 MSI Installer」で64bit版Python 2.7.6をインストール(手元のインストール先は「C:\Python27」)
また,最新版のpipもセットアップしておきます.
1.2. Cythonのセットアップ
- github上の最新リリース(今回は0.25.1)をダウンロード
- 作業用フォルダ(今回は work/python/cython-0.25.1 )に展開
- 次の2つのコマンドを実行し,ビルドに必要な環境変数を設定12SET DISTUTILS_USE_SDK=1SET MSSdk=1
- 「work/python/cython-0.25.1」内で,「python setup.py install」コマンドを実行
- ビルドの正常終了を確認
成功したら「Finished processing dependencies for Cython==0.25.1」というメッセージが最後に出力されていると思います.
ちなみに,今回はソースからビルドしましたが,もしかしたらpipでも問題ないかもしれません(未確認)
2. numpyのビルド
- github上の最新リリース(今回は1.11.2)をダウンロード
- 作業用フォルダ(今回は work/python/numpy-1.11.2 )に展開
- numpy-1.11.2フォルダ内の「site.cfg.example」を「site.cfg」という名前でコピー
- コピーされた「site.cfg」をテキストエディタ等で開き,150行目あたりの「# [mkl]」で始まる行~「# lapack_libs …」で終わる行を以下の内容で置換(※各行の先頭のシャープ記号 # がなくなっていることに注意)
12345[mkl]include_dirs = C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\includelibrary_dirs = C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\mkl\lib\intel64;C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2017\windows\compiler\lib\intel64mkl_libs = mkl_lapack95_lp64,mkl_blas95_lp64,mkl_intel_lp64,mkl_intel_thread,mkl_core,libiomp5mdlapack_libs = mkl_lapack95_lp64,mkl_blas95_lp64,mkl_intel_lp64,mkl_intel_thread,mkl_core,libiomp5md - 「numpy-1.11.2/numpy/distutils」内,「intelcompiler.py」の90行目あたりでビルドオプションを指定しているので,「/MD」動的リンクオプションを「/MT」静的リンクオプションに変更
- 「numpy-1.11.2/numpy/distutils/fcompiler」内,「intel.py」の162行目あたりでビルドオプションを指定しているので,「/MD」動的リンクオプションを「/MT」静的リンクオプションに変更
- ※この項目はビルド失敗を回避するための応急処置です.正しい対処方法をご存じの方はぜひご教授ください
- 「numpy-1.11.2/numpy/distutils」内,「msvc9compiler.py」の56行目あたりでビルドが失敗したため,当該部分を削除(32ビット版のビルドだけに関連する部分なので問題ない?)
- 「numpy/distutils/command」内,「config.py」の84行目あたりの「self.fcompiler.get_version()」でビルドが失敗したため,当該条件分岐を削除(fortran compilerが使用可能かどうか判定しているだけなので問題ない?)
- 「numpy/distutils/command」内,「build_ext.py」の223行目あたりの「… and self.fcompiler.get_version()」でビルドが失敗したため,当該条件判定を削除
- numpy-1.11.2フォルダ内にて以下のコマンドを実行してビルド開始1python setup.py config --compiler=intelemw build_clib --compiler=intelemw build_ext --compiler=intelemw install
(参考:Building numpy/scipy with Intel MKL and Intel Compilers on Windows) - ビルドの正常終了を確認:
成功したら「Finished processing dependencies for numpy==1.1.2」というメッセージが最後に出力されるはずです.
- DLL依存関係の確認
試しに,ビルドされた「numpy-1.11.2/build/lib.win-amd64-2.7/numpy/core/multiarray.pyd」をDependency Walkerで確認すると,「libiomp5md.dll」以外には特殊なDLLに依存していないことがわかります(libiomp5md.dll の必要性についてはこちらのページなどを参照)
3. scipyのビルド
- github上の最新リリース(今回は0.18.1)をダウンロード
- 作業用フォルダ(今回は work/python/scipy-0.18.1 )に展開
- scipy-0.18.1フォルダ内にて以下のコマンドを実行してビルド開始1python setup.py config --compiler=intelemw --fcompiler=intelvem build_clib --compiler=intelemw --fcompiler=intelvem build_ext --compiler=intelemw --fcompiler=intelvem install
(参考:Building numpy/scipy with Intel MKL and Intel Compilers on Windows) - ビルドの正常終了を確認:
成功したら「Finished processing dependencies for scipy==0.18.1」というメッセージが最後に出力されはずです.
4. scikit-learn のビルド
- github上の最新リリース(今回は0.18.1)をダウンロード
- 作業用フォルダ(今回は work/python/scikit-learn-0.18.1 )に展開
- scikit-learn-0.18.1フォルダ内にて以下のコマンドを実行してビルド開始1python setup.py install
- ビルドの正常終了を確認:
成功していたら「running install_clib」というメッセージが最後に出力されるはずです.
5. Maya 2016.6 からの利用
Mayaからnumpy,scipy,scikit-learnを利用するために,ビルドされたライブラリをMAYA_SCRIPT_PATHやPYTHONPATHが通っているフォルダにコピーします.なお,いずれのライブラリもlibomp5md.dll も必要としますが,Maya 2016.6 自体が同DLLを利用する(C:\Program Files\Autodesk\Maya2016\bin\ 配置済みの)ため,特にインストール作業は不要なようです.また,今回は下記のコピー元フォルダを,適当にデフォルトのscriptsフォルダ(Users\ユーザー名\Documents\maya\2016\ja_JP\scripts)にコピーします.
- numpy
- C:\Python27\Lib\site-packages\numpy-1.11.2-py2.7-win-amd64.egg\numpy
- scipy
- C:\Python27\Lib\site-packages\scipy-0.18.1-py2.7-win-amd64.egg\scipy
- scikit-learn
- C:\Python27\Lib\site-packages\sklearn
試しに公式のSVM分類器サンプルプログラムをMayaスクリプトエディタから実行したところ,問題なく動作しているようです.
6. MotionBuilder 2016.1 からの利用とテスト
MotionBuilderからnumpy,scipy,scikit-learnを利用するためには3つのライブラリをプラグインパスが通っているフォルダにコピーします.さらに,Mayaとは異なり,libomp5md.dll もパスの通ったフォルダに配置しておく必要があります.
Mayaと同様にSVM分類器のサンプルプログラムを実行したところ,こちらも問題なく動作しているようです.
7. まとめ
MayaやMotionBuilderのpythonスクリプティング環境からnumpyやscipy,scikit-learnを利用するための手順を紹介しました.現時点では最低限の動作しか確認していませんが,機械学習を利用したDCCプラグイン開発の基盤としての利用が期待できます.あるいは,データ分析結果を可視化するツールとしてMayaを利用するような変わった用途もあるかもしれません(?)
また,今回取り上げたライブラリ以外についても同様の手順でビルドできる可能性がありますので,当研究室でもいろいろと試してみたいと思います.
おまけ. ビルド済みバイナリ
(2017.3.10追記) 手元でのビルド済みバイナリも公開します.ライセンスについては各パッケージ記載の条項をご確認ください.なお,不具合等については一切サポートできませんのでご了承ください.