ML モデルに魂を吹き込む: MVP に基づく超シンプルなデプロイメント ソリューション

ML モデルに魂を吹き込む: MVP に基づく超シンプルなデプロイメント ソリューション

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discovery)から転載したものです。

優れた機械学習モデルを開発するのは難しいですが、作業はそこで終わりません。展開されるまでは役に立たず、他の人が簡単にアクセスできるようになります。

モデルをデプロイする方法は多数ありますが、ここでは基本的な MVP に有効な非常にシンプルなソリューションについてお話ししたいと思います。Flask を使用してモデルの API を作成し、ソフトウェア サーバーに Gunicorn を使用し、Web サイト サーバーに Nginx を使用し、それを Docker でラップして他のマシン (特に AWS と GCP) へのデプロイを容易にします。

[[328507]]

サーバーの設定

私は、個人または仕事用のハードウェアを使用するのではなく、この目的のために特別にレンタルしたサーバーを使用して新しい構成を実験することを好みます。そうすれば、何かがひどく損傷したとしても、問題にはなりません。

したがって、Linode の使用をお勧めします。私は個人的に実験に使用していますが、そのハードウェアは使い心地が良いです。 Ubuntu 18.04 LTS を使用している限り、他の必要なサービスも使用できます。

この部分はLinidesを使用する人に適しています。 Linodes に移動し、「Linode の追加」をクリックします。記入しなければならない事項がいくつかあります。ディストリビューションバージョンでは、Ubuntu 18.04 LTS イメージを選択することをお勧めします。

  • 地域 - あなたの近くの地域(私はドイツのフランクフルトを使用しました)
  • Linode プラン – Nanode (月額 5 ドルのみ、ニーズを満たすのに十分)
  • ルートパスワード - あなたのパスワード

次に、「作成」をクリックします。数分ほど経つと、「ネットワーク」に移動し、SSH 経由でサーバーにアクセスするための情報を確認できます。


次のステップは、サーバーに接続し、sudo 権限を持つ非 root ユーザーを作成することです。この背後にあるロジックは非常に単純です。サーバー上ですべてを root として実行したくないのです。そうすると、物事を壊すのがはるかに簡単だからです。

  1. adduser ユーザー名usermod -aG sudoユーザー名

最後に、新しいユーザーに切り替えます。

  1. su — ユーザー名

アプリケーションコンテナを作成する

システム全体の構成は、アプリケーション コンテナー (Flask + Gunicorn) と Web コンテナー (Nginx Web サーバー) の 2 つの部分に分かれています。

[[328508]]

画像ソース: unsplash

(1)ステップ0 - DockerとDocker Composeをインストールする

Docker と Docker-compose のインストールは非常に簡単で、それぞれ 4 行と 2 行で実行できます。

(2)ステップ1 - FlaskAppとWSGIエントリポイントを作成する

ホームディレクトリに flask アプリディレクトリを作成し、次のファイルを配置します。

  1. フラスコからインポートFlask
  2. サーバー= Flask (__name__)
  3. @server.route('/')
  4. defhello_world():
  5. 'hello world!' を返します。

これは、ほとんど機能のない最も基本的な Flask アプリケーションです。モデルをロードせず、GET / POST リクエストやコンテンツ (以下に表示されます) を追加しません。現在、「helloworld」と書かれたホームページを持つアプリケーションがあります。

この部分は非常に簡単です。Gunicorn をポート 8000 で実行するための別のファイルを作成するだけです。

(3)ステップ2 - Flask用のDockerイメージを作成する

ここで、これらのファイルを取得して後で実行できるイメージを作成する Dockerfile を作成する必要があります。

  1. Python:3.6.7より
  2. WORKDIRusr/src/flask_app
  3. COPYrequirements.txt 。
  4. pip install --no-cache-dir -r requirements.txt を実行します。
  5. コピー 。 。

Docker に詳しくない人のために、このスクリプトが行うことを説明します。

  • Python 3.6.7 イメージのインポート
  • すべてのファイルの作業ディレクトリを設定する
  • Flask、Gunicorn、および Flask アプリケーションを実行するために必要なその他すべてのファイルが含まれる要件ファイルをコピーします。

次に、RUN コマンドを使用して必要なすべてのパッケージがインストールされ、最後にすべてのファイルが flaskdir からコンテナー内の usrscrflask アプリケーションにコピーされます。次に、このファイルを同じ flask_app ディレクトリに配置し、requirements.txt を追加します。

  1. フラスコ
  2. ガンコーン

ディレクトリと内容について混乱した場合は、記事の最後にある完全なプロジェクト構造を確認するか、GitHub リポジトリにアクセスしてください。

(4)ステップ3 - Nginxファイルを作成する

[[328509]]

画像ソース: unsplash

Nginx を実行するには、いくつかの設定が必要です。ただし、次の手順に進む前に、ホーム ディレクトリ内 (flask_app と同じレベル) に nginx ディレクトリを作成してください。その後、最初に必要なファイルは nginx.conf です。このファイルには、ほぼすべての基本的な Nginx 情報と変数が含まれています。

基本的な Nginx 設定を見てみましょう。

  1. # Nginxサーバーを所有して実行するユーザーを定義します
  2. ユーザー nginx;
  3. # ワーカープロセスの数を定義します。推奨値は
  4. サーバーで使用されているコア数
  5. ワーカープロセス 1;
  6. # エラーログのファイルシステム上の場所と最小値を定義します
  7. # メッセージをログに記録する重大度
  8. error_log /var/log/nginx/error.log 警告;
  9. # メインNGINXプロセスのプロセスIDを保存するファイルを定義します
  10. pid /var/run/nginx.pid;
  11. # イベント ブロックは、接続処理に影響するパラメータを定義します。
  12. イベント {
  13. # ワーカープロセスによって開くことができる同時接続の最大数を定義します$
  14. ワーカー接続 1024;
  15. }
  16. # http ブロックは、NGINX が HTTP Web トラフィックを処理する方法のパラメータを定義します。
  17. http {
  18. # NGINXでサポートされているファイルタイプのリストを定義するファイルをインクルードします
  19. /etc/nginx/mime.types を含めます。
  20. # ユーザーに返されるデフォルトのファイルタイプを定義する
  21. デフォルトタイプはtext/htmlです。
  22. # ログメッセージの形式を定義します。
  23. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  24. '$status$body_bytes_sent "$http_referer" '
  25. '"$http_user_agent" "$http_x_forwarded_for"';
  26. # NGINXへのアクセス試行のログの場所を定義する
  27. access_log /var/log/nginx/access.log メイン;
  28. # 静的コンテンツの配信を最適化するためのパラメータを定義する
  29. ファイル送信オン;
  30. tcp_nopush オン;
  31. tcp_nodelay オン;
  32. # クライアントとのキープアライブ接続のタイムアウト値を定義する
  33. キープアライブタイムアウト65;
  34. # 転送するデータ量を減らすためにgzip圧縮アルゴリズムの使用を定義します
  35. #gzip オン;
  36. # 仮想ホスト/サーバーの追加パラメータを含める
  37. /etc/nginx/conf.d/*.conf を含めます。
  38. }

2 番目のファイル - アプリケーション固有の構成。これを行うには、2 つの一般的な方法があります。

  • /etc/nginx/sites-available/your_project に設定ファイルを作成し、/etc/nginx/sites-enabled/your_project へのシンボリック リンクを作成します。
  • メインの Nginx ディレクトリに project.conf を作成するだけです。以下は2番目の方法です。
    1. サーバー{
    2. 聞く 80;
    3. サーバー名 docker_flask_gunicorn_nginx;
    4. 位置 / {
    5. proxy_pass http://flask_app:8000;
    6. # 変更しないでください
    7. proxy_set_header ホスト $host;
    8. proxy_set_header X-Real-IP $remote_addr;
    9. proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
    10. }
    11. 場所 /static {
    12. ^/static(.*) /$1 を書き換えてbreak;
    13. ルート /static;
    14. }
    15. }

注意すべき点がいくつかあります。まず、アプリケーションが実行されるポートを指定する listen80 を確認します。デフォルトのポートとして、80 を選択します。次に、サーバー名です。 Linode から取得した IP アドレスを指定することも、Docker イメージ名を使用することもできます。

最後に、proxy pass コマンドは、Nginx 構成を flask プロジェクトにポイントする必要があります。 Flask コンテナの名前は flask_app (後ほど紹介します) なので、コンテナの名前と Flask プロジェクトで指定したポートだけを使用すれば大丈夫です。

(5)ステップ4 — Nginx用のDockerイメージの作成

この特定の Docker イメージは非常にシンプルです。 Flask と同様に、わずか 5 行で構成され、次の 2 つのことだけを実行します。

  1. nginx:1.15.8より
  2. rm/etc/nginx/nginx.conf を実行します。
  3. nginx.conf/etc/nginx/ をコピーします。
  4. rm /etc/nginx/conf.d/default.conf を実行します。
  5. project.conf/etc/nginx/conf.d/ をコピーします。

nginx イメージをインポートし、ファイルをコピーして、デフォルトのファイルに置き換えます。

(6)ステップ5 — Dockerfilesとdocker-composeを組み合わせる

現在、2 つの Dockerfile があります。

  • フラスコ + グニコーン用
  • Nginx 用のもう 1 つ。

今度は、それらを相互作用させてシステム全体を実行させます。これを実現するには、docker-compose が使用されます。ホームディレクトリに docker-compose.yml ファイルを作成するだけです。

  1. バージョン: '3'
  2. サービス:
  3. フラスコアプリ:
  4. コンテナ名: flask_app
  5. 再起動: 常に
  6. ビルド: ./flask_app
  7. ポート:
  8. - 「8000:8000」
  9. コマンド: gunicorn -w 1 -b 0.0.0.0:8000 wsgi:server
  10. nginx:
  11. コンテナ名: nginx
  12. 再起動: 常に
  13. ビルド: ./nginx
  14. ポート:
  15. - 「80:80」
  16. 依存:
  17. - フラスコアプリ

これがどのように機能するかを理解するために、いくつかの重要な問題について考えてみましょう。

  • まず、docker-compose は flask_app と nginx の 2 つの部分 (2 つのサービス) に分割されます。次の行からわかるように、flask_app コンテナは Flask アプリケーションを実行する Gunicorn を実行し、1 つのワーカーでポート 8000 に切り替えます。
  • 2 番目のコンテナはポート 80 でのみ Nginx を実行します。また、depends_on セクションに注意してください。このセクションでは、docker-compose に、まず flask_app コンテナを起動し、次に --- nginx を起動するように指示しています。これは、これら 2 つのコンテナが相互に依存しているためです。

[[328510]]

画像ソース: unsplash

また、この Docker セットアップを簡単に実行できるようにするために、もう 1 つ追加する必要があるものがあります。それが run_docker.sh ファイルです。

  1. echo 古い docker プロセスを強制終了する
  2. docker-compose rm -fs
  3. echo Dockerコンテナの構築
  4. docker-compose を起動 --build -d

セットアップは docker-compose up を実行するのと同じくらい簡単ですが、まずこの時点で古い docker プロセスがアクティブになっていないことを確認してください。

(7)ステップ6 - すべてをまとめる

現在のプロジェクト構造は次のようになります。

  1. ├── フラスコアプリ
  2. │ ├── app.py
  3. │ ├── wsgi.py
  4. │ └── Dockerファイル
  5. ├── nginx
  6. │ ├── nginx.conf
  7. │ ├── プロジェクト.conf
  8. │ └── Dockerファイル
  9. ├── docker-compose.yml
  10. └── run_docker.sh

すべての準備が整ったことを確認したら、Docker を実行できます。

  1. bash 実行_docker.sh

Linode から取得した IP に移動し、ブラウザでメイン ページを表示します。


(8)ステップ7 - 結果が得られない場合はどうすればいいですか?

まず Linode でサーバーをレンタルし、docker と docker-compose をインストールし、git リポジトリをクローンして bash run_docker.sh を実行します。

正常に実行されることを確認したら、変更を開始します。何かが失敗するまで、Flask、Dockerfiles、または docker-compose を使用してみてください。その後、問題を特定し、解決に取り組みます。

(9)ステップ8 - 次は何ですか?

[[328512]]

画像ソース: unsplash

次に追加するのは、FlaskApp での POST リクエストのサポートです。この方法では、モデルにリクエストを送信し、応答を受け取ることができます。

必要なのは、リクエストを処理できるモデルと、POST リクエストが自立できることの 2 つです。

  1. FlaskからimportFlask、request、jsonify
  2. サーバー= Flask (__name__)
  3. defrun_request():
  4. インデックス= int (request.json['index'])
  5. リスト= ['赤', '緑', '青', '黄', '黒']
  6. リストを返す[インデックス]
  7. @server.route('/',メソッド=['GET', 'POST'])
  8. defhello_world():
  9. リクエストメソッド== 'GET' の場合:
  10. 'モデルは起動して実行中です。POST リクエストを送信してください' を返します。
  11. それ以外:
  12. 戻り実行リクエスト()

便宜上、この場合、モデルはカラー リストの i 番目の要素のみを返します。しかし、実際にはどのモデルを実行するかは重要ではなく、すべてのメソッド (server = Flask(__name__) がある場所) でモデルのインスタンスを作成するだけで、準備は完了です。

ここで、IP アドレスに移動すると、「モデルは起動して実行中です。POST リクエストを送信しています」というメッセージが表示されます。これは、IP に移動するだけで GET リクエストとして扱われるためです。

ただし、モデル インデックスを含む json ファイルを使用して POST リクエストを送信してみましょう。私は Postman を使用していますが、好みに応じて何でも使用できます (例: Curl)。


うまくいきました! これで、GET / POST リクエストを受信するための他のルートを追加できます。このアイデアの背後にある理由は、複数のモデルをロードすることで、URL に基づいて特定のモデルにリクエストを送信できるためです。

(10)ステップ9 - さらに進むには?

実は、もう 1 つ重要なステップがあります。この Docker セットアップを迅速に展開するには、クラウド スペースに展開することをお勧めします。このアプローチの主な利点は、AWS がクラスター管理インフラストラクチャを提供することです。

学びましたか?

<<:  人工知能技術は将来のネットワークセキュリティの起爆点と原動力となるかもしれない

>>:  2020 年に最も注目される人工知能 (AI) アプリケーション トップ 10

ブログ    

推薦する

強化学習でデータ分析を行うにはどうすればいいでしょうか?シンガポール国立大学等によるTKDE 2022レビュー論文

データの処理と分析は基本的かつ広範囲にわたります。アルゴリズムはデータの処理と分析において重要な役割...

Nervana Technology の深掘り: Neon を使用したエンドツーエンドの音声認識の実装方法

音声は本質的に即時の信号です。音声で伝えられる情報要素は、複数の時間スケールで進化します。空気圧の影...

...

Action Bagelは人工知能技術を組み合わせてインテリジェントな分析エンジンを作成します

[51CTO.com からのオリジナル記事] インターネットの継続的な更新と反復により、ネットワーク...

人工知能はモバイルインターネットデバイスを変えようとしている

安価な高速インターネット、安全なクラウド ストレージ、モバイル ソリューション、低コストのデバイスの...

Soraはどのように機能しますか?

翻訳者 |ブガッティレビュー | Chonglou先週、 OpenAIチームは、物理世界の基本的な側...

5分で様々な人工知能技術を紹介

人工知能は、コンピューターが人間と同様のレベルの知能を発揮できるようにするさまざまな技術を網羅する幅...

...

AIチップの過去、現在、そして未来

AIの力は、医療紛争、化学合成、犯罪者識別、自動運転などの応用分野で拡大しています。 AI は現在何...

...

...

...

モバイルアプリの開発とビジネスにおける人工知能の役割は何ですか?

人工知能の誕生により、モバイル アプリケーションに大きな可能性をもたらすまったく新しい時代が到来しま...

...