Edited at

ABEJA Platform に private python module を使う TIPS

ABEJA Platform AdventCalendar 2018 20日目の記事です.

今回は python の private module を ABEJA Platform で使う TIPS について紹介したいと思います.


モチベーション

ABEJA Platform ではプリインストールされたモジュール以外を使いたい場合,requirements.txtに記載しておくとモデルの起動時にインストールされる仕様となっています.

cf. https://developers.abeja.io/organization/model/#ライブラリの追加

この際,public なモジュールを使う場合には特に問題にはなりませんが,会社の共通ライブラリなど private なモジュールを使いたい場合にインストールできないという問題が発生します.今回はそういった場合にどのようにデプロイすべきかの TIPS を紹介します.なお,private python module は package cloud などの private pypi repository にアップロードされている前提とします.


解決策


その1

まず最も簡単に思いつく方法は AWS Lambda の python デプロイパッケージ にあるような依存関係を全てローカルにインストールしてソースコードに含めてアップロードする方法です.

$ pip install Pillow --t .

$ tar -zcvf model.tar.gz *

ただし,この方法には1つ弱点があります.python モジュールに C のネイティブライブラリを用いる必要がある場合に対応が難しいことです.必要なネイティブライブラリを集めたりLD_LIBRARY_PATHを正しく環境変数に正しく設定したりする必要があります.特に Deep Learning で使われるようなモジュールには高速化のため C のネイティブレベルで手を入れているものが多く,共通化の障壁となります.


その2

上記の問題を解決するために 仮想環境を使う方法 の類型も考えられますが,ネイティブライブラリ間の依存関係を解決しつつ全てをソースコードに含めていくのが面倒であるため,今回は private pypi repository をextra-index-urlとして追加する方法を紹介します.

まず,以下のようにpip.confをソースコードに含めます.今回は package cloud を例に紹介しますが,適宜利用している private pypi repository に読み替えて下さい.

$ tree

.
├── main.py
├── pip.conf
└── requirements.txt

0 directories, 3 files


pip.conf

[global]

extra-index-url=https://{API_TOKEN}:@packagecloud.io/xxx/pypi/simple

さらに,デプロイする際に以下の環境変数を加えて下さい.これによって,モジュールのインストール時にソースコードに含まれるpip.confが読み込まれ,依存パッケージが正しくインストールされるようになります.


まとめ

extra-index-urlを追加することで,ABEJA Platform でも private python module を使えるようになる方法を紹介しました.これで会社の共通ライブラリを活用してモデル開発もできるようになりました.ではでは,効率の良い開発ライフを!