AWS
numpy
ElasticBeanstalk
mkl
ebextensions

Elastic Beanstalkの.ebextensionsでIntel MKLをインストール

AWS Elastic Beanstalkの環境に、Intel Math Kernel Library(Intel MKL)をインストールするための.ebextensions集です。

前提条件

Beanstalkのプラットフォームは、64bit Amazon Linux 2017.09 v2.6.3 running Python 3.6 で確認しています。

以下の手順を実行する前に、intel.comでMKLのregistrationをしておく必要があります。(手順的には必要ないですが、ライセンス的に)

.ebextensions

処理の都合上、1つのconfigファイルでは完結できないので、以下のconfigを順番に実行する必要があります。

リポジトリを登録

Installing Intel® Performance Libraries and Intel® Distribution for Python* Using YUM Repository に記載のリポジトリを登録します。

01-mkl-repo.config
commands:
    01-add-repo:
        command: yum-config-manager --add-repo https://yum.repos.intel.com/setup/intelproducts.repo
    02-import:
        command: rpm --import https://yum.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB

Intel MKLライブラリをインストール

yumパッケージ名は上述したIntelのドキュメントに記載されています。intel-mkl だけで指定したいところですが、正しいパッケージ名を書かないとBeanstalkのデプロイでエラーになります。

02-mkl-package.config
packages:
    yum:
        intel-mkl-2018.1-038: []

共有ライブラリのディレクトリを登録

03-mkl-ldconfig.config
files:
    "/etc/ld.so.conf.d/intelproducts.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64
commands:
    ldconfig:
        command: ldconfig

numpy, scipyのビルド設定

これは厳密にはIntel MKLとは関係ないですが、MKLを入れる目的はnumpy, scipyで使うためなので、こちらに記載してます。

numpy, scipyのビルド時にMKLが使われるようにするのと、numpy, scipyをインストールする際にwheelを使わず、MKLをリンクしてビルドするための設定です。

ついでに、ビルド時に必要なgfortranもインストールします。

参考: pip で MKL にリンクされた numpy, scipy が自動的にインストールされるようにする

04-mkl-numpy.config
packages:
    yum:
        gcc-gfortran: []
files:
    "/root/.numpy-site.cfg":
        mode: "000644"
        owner: root
        group: root
        content: |
            [mkl] 
            library_dirs = /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64
            include_dirs = /opt/intel/compilers_and_libraries/linux/mkl/include 
            mkl_libs = mkl_rt 
            lapack_libs =  
    "/root/.config/pip/pip.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            [install]
            no-binary = numpy,scipy
            [wheel]
            no-binary = numpy,scipy

おわりに

numpy, scipyのインストールは、アプリケーションのrequirements.txtでやってください。

上記の手順でBeanstalk環境にMKL+numpy,scipy環境がセットアップされますが、scipyのコンパイルに時間がかかるので、実際は毎回ビルドせずに、一度ビルドしたらwheel化しておいた方が良いかもしれません。