[Advent Calendar 2017 Day8] Azure Functions 上で Python と CNTK を使ってみる

8 minute read

この記事は 旧 Japan Azure PaaS Support Blog からのコピーとなります。
記載されている内容は 2017 年 12 月 8 日 時点のものとなり、現時点におきましては変更されている可能性がありますので、ご注意下さい。

こちらの記事は、Qiita に掲載した Microsoft Azure Tech Advent Calendar 2017 の企画に基づき、執筆した内容となります。
カレンダーに掲載された記事の一覧は、 こちら よりご確認ください。

こんにちは。Azure Dev サポートの村山です。

今回は、Azure Functions で 64bit の Python を利用して、 CNTK と呼ばれるオープン ソースのライブラリ使って、与えられた値に基づいて予測を行う API を作ってみようと思います。

CNTK とは

弊社 Microsoft が開発している Deep Learning が利用可能なオープン ソースのライブラリになります。現在、Python や C#、C++ 、BrainScript で提供されております。

詳しくは こちら のドキュメントに記載されおり、また質問やフィードバックに関しては こちら のページになります。

Azure Functions では、C# や、Javascript のほかにも、 Python や PHP、PowerShell が試験段階という位置付けで提供されており、利用可能なデフォルトの Python ランタイムは 32 bit のみですが、実は拡張機能をインストールすることで 64 bit の Python も利用可能になります。

今回は、そんな Azure Functions での拡張機能の Python の利用方法をご紹介するとともに、 流行りのライブラリをインストールして遊んでみたいと思います。

最後に Azure Functions で現在利用可能な言語に関してもちょこっと紹介します。

1. App Service (Web Apps や Function App など)上の Python の 64 bit 対応に関して


まず、Function App の作成にいきなり入る前に、なぜ 64 bit の Python を利用する際に、拡張機能のインストールが必要なのかご説明します。

Web Apps や Function App では、現在デフォルトでは 32 bit の Python しか利用できません。(バージョンは Python 2.7.8 or Python 3.4.1 のいずれか)

このため、Web Appsや Function App では、[アプリケーション 設定] からプラットフォームのアーキテクチャを選択可能ですが、デフォルトでは 64 bit のPython は利用することはできず、アプリケーション設定で、設定を 64 bit へ変更した後も 32 bit の Python が利用されます。

Azure Web Apps や Funcion App で 64 bit の Python を利用するためには、別途拡張機能で提供されている64bit の Python ランタイムをインストールして設定する必要があります。

今回は割愛しますが、Web Apps や API Apps で 64bit の Python を利用する場合は、 こちら の設定を試してみてください。

この記事では、Funcion App 上で 64 bit の Python 拡張機能をインストールして利用します。

その前に、試しに Python の Function を作って、Azure ポータル上で動かしてみようと思います。

2. Function App で Python の Function を作ってみる


まず、Azure ポータルからFunction App を作成してください。ホスティング プランとして、" 従量課金プラン " と、" App Service プラン " があると思いますが、今回は " App Service プラン " を選択します。

Function App が作成できたら、さっそく Python の Function を作ってみましょう。

画面内の "関数" 右側の + マークをクリックした後、Http trigger もしくは Queue trigger を選択して、言語として Python を選択してください。

各トリガーの説明に関しては こちら をご覧ください

次に、作成した関数を使って、現在のPython のバージョンを確認してみましょう。下記のコードを保存して実行すると Python のバージョンが表示されます。

from platform import python_versionprint(python_version())

デフォルトで選択可能な Pyhton のバージョンは2.7.8 か、3.4.1 のみですが、この後拡張機能をインストールして 64 bit の Python を利用できるように設定します。

3. 拡張機能のインストールと設定


次に、拡張機能のインストールを行い、64 bit の Python を利用できるように設定します。

先ほどの Function ポータル上のタブからプラットフォーム機能から Kudu を選択して、Web Apps の管理サイトである Kudu へ移動してください。

https://FunctionApp名.scm.azurewebsites.net からもアクセス可能です。

Kudu サイトへ移動後、画面上部の [Debug console] -> [CMD] と選択して、コンソール画面を表示してください。

その後、画面中段から site -> tools と選択してディレクトリを移動してください。 (コンソール画面で cd site\tools と入力して移動することもできます。)

このディレクトリに拡張機能をインストールすることで、64 bit の Python が利用可能になります。

現在利用可能な 他の Python のバージョンに関しては、 こちら に記載されております。

今回は提供されている中で一番新しい Python 3.6.1 x64 をインストールします。Kudu のコンソール画面内で下記のコマンドを実行してください。

nuget.exe install -Source https://www.siteextensions.net/api/v2/ -OutputDirectory D:\home\site\tools python361x64

コマンドを実行すると、Python の拡張機能がインストールされて、フォルダが作成されます。

Function で利用するためには、tools 直下に python.exe を配置する必要がありますのでmv コマンドでインストールした中身を移動します。

mv /d/home/site/tools/python361x64.3.6.1.3/content/python361x64/* /d/home/site/tools/

これで、 Function App で 64 bit の Python  を利用する準備が整いました。

試しにさっきのコードをもう一度実行してみましょう。バージョンが変更されインストールした拡張機能が動いていることが確認できます。

4. CNTK のインストール


64 bit の Python を利用する準備が整いましたので、これから CNTK のインストールを行います。

まず、CNTK が依存しているモジュール ( numpy , scipy ) をインストールしますので、先ほどの Kudu コンソール上で下記のコマンドを実行してください。

(カレント ディレクトリが D:\home\site\tools であることをご確認ください。)

python -m pip install numpy python -m pip install scipy

numpy と scipy をインストールしたら、最後に CNTK をインストールします。

こちら から、今回インストールした Python のバージョンに合わせてリンクをコピーしてください。

今回のチュートリアルでは、Python 3.6.1 を拡張機能としてインストールしたので、CNTK は Python 3.6 CPU only を選択してます。

python -m pip install https://cntk.ai/PythonWheel/CPU-Only/cntk-2.3-cp36-cp36m-win_amd64.whl

インストールが完了すると、コンソール上に下記のように表示されます。

必要なモジュールのインストールが終了しましたので、Function を作っていきましょう。

5. ロジスティック回帰モデルの作成と、API


今回は、CNTK の Github チュートリアル内にある、ロジスティック回帰モデル作成してみようと思います。

ロジスティック回帰モデルは、入力された特徴量に基づいて2値 (以上) のクラスに分類する、教師あり学習モデルです。

詳しいロジスティック回帰モデルのチュートリアルは こちら に掲載されてます。

チュートリアル内には、モデルの作成には直接関係のないコードも含まれておりますので、モデル作成に必要なコードのみを抽出すると、下記の通りになります。

試しに関数を実行すると、Function のポータルのログ上に、チュートリアルに記載されているようにトレーニング過程と、ラベルと予測データが表示されます。


今回は、データ量も少ないのでモデルの学習にそこまで時間はかからないですが、大規模なデータで学習を行う場合、モデルの学習には相当な時間がかかります。

ローカルで学習したモデルを、Funcion App 上で 利用するシナリオ を想定して、CNTK 内にある save 関数でモデルを保存します。先ほどのコードに下記を追加して再度実行してください。

out.save("D:/home/site/wwwroot/trained_model")

Kudu サイトで確認すると、モデル ファイルが作成されているのがわかります。今回はデータ量が少ないのでモデルのファイル サイズも小さいですね。

このモデル ファイルをロードして、送られてきたデータに対してどちらのクラスか予測を行う Python の関数を新たに作ってみましょう。

実際にモデルがちゃんとロードされているかを確認するために、先ほど作った関数に下記のコードを追加して再度実行してください。

test_data = features[0] print(test_data) print(out.eval({feature:test_data}))

テスト データとして使用する特徴量と、予測結果であるクラスの所属確率がログに表示されますので、メモ帳などに控えておいてください。


それでは、Azure ポータルで、Python の Function を作成しましょう、今回は API を作りますので HttpTrigger関数を選択してください。

CNTK では load_model 関数を利用することで保存したモデルをロードすることができます。

今回はこんな感じでコードを書いてみました。

送信する要求本文に、パラメータとして、さっき控えておいた値を入れてください。

Function を実行すると、先ほど控えておいたクラスの所属確率と同じ結果が出てくることが分かります。きちんと訓練されたモデルがロードされていますね。

レスポンスにどちらのクラスに所属するかを出すようにしているので、データを投げたらその予測結果を返します。

サーバーのセット アップなしにコードを書くだけで API が作れるのは非常に便利です。

CNTK の他のチュートリアルも面白いので、ぜひ試してみてください。

6. 注意事項


商用環境での、プレビュー・試験段階の言語のご利用はお控えください

冒頭でも少しご案内しましたが、Azure Functions 上での Python の利用は現在試験段階となります。(2017/12/08 現在)

試験段階の言語は現在サポートされておらず、Function のランタイムの更新などがあった場合、廃止される可能性もございます。

このため、もしも運用環境上でお困りごとがあった場合には、弊社サポート サービスにて十分にご支援を差し上げることができない可能性がございますのでご了承ください。

下記資料内で、現在サポ―トされている言語に関してご案内しております。

https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages

なお、試験段階ではございますが、Python に関しては、商用環境でのご利用をご要望のお客様が多数いらっしゃいます。

このため、時期は未定とはなりますが、新しい Function ランタイム ver 2.0 で提供できますよう現在開発を進めている段階です。

https://github.com/Azure/Azure-Functions/wiki/Language-support#what-about-the-experimental-languages-that-are-in-v1

また、Azure Functions 上でPython のご利用をご要望いただいているお客様に向けて、現在 Survey を行っておりますので、もしよろしければご参加いただけますと幸いです。

モデルを作成する場合は、ファイルサイズが大きくなりすぎないように注意してください。

モデルファイルをロードする際にファイルサイズが大きすぎると、ロードするまでに時間がかかる可能性がございます。

特に、 従量課金プラン をご利用の場合には、初回 Function が呼びだされた際は、まず Azure Storage からデータが実行環境にロードされ、その後  Function が実行されます。

Function が一定期間実行されない場合は、自動的にデータがアンロードされ、次回実行時にまた同じような動作を行います。

このため、"常時接続" 機能を使ってあらかじめデータをロードした状態の保持が可能な、App Service プランと比べて Function の呼び出しが遅くなります。

また、関数の実行に時間がかかりすぎると、Function がタイムアウトすることもあり、HttpTrigger の場合は、約 230 秒でタイムアウトが発生しますので、重すぎる関数の実行はお控えください。

そのほかの Azure Functions のベストプラクティスに関しては、 こちら でご案内しております。

それでは、失礼します !