Appleシステムでは、記事の画像が正常に表示されない場合は、Safariブラウザを最新バージョンにアップグレードするか、ChromeまたはFirefoxブラウザを使用して開いてください。)
ディープラーニングモデルのトレーニングとテストを行った後、アルゴリズムモデルをオンラインにして本番環境にデプロイする場合は、追加の処理作業を行う必要があります。ディープラーニングモデルには計算能力に対する大きな需要があるため、オンラインプロセスでは、ネットワークスケールを縮小し、専用ハードウェアを使用し、C / Sアーキテクチャネットワークを介してクラウドコンピューティングを実行する方法は一般に3つあります。AIレモンブロガーは3番目の方法を推奨しています。つまり、モデルはサーバー側にデプロイされ、クライアント側は入力データをネットワーク経由でサーバーに送信し、計算結果はクライアント側に渡されます。5Gの時代が間近に迫っており、IPv6プロトコルが大規模に展開され、すべてが相互接続されようとしています。特に、重要なインフラストラクチャとしてのワイヤレスモバイルインターネットが一般的な傾向です。ネットワークを通じて、最も低コストのローエンドハードウェアでも、精度を損なうことなく、より高速で深層学習モデルの計算結果を取得できます。たとえば、ASRT音声認識システムはこのように展開されており、音声検索などのタスクのためにAILemonWebサイトに音声認識サービスを提供することができました。
1モデルの展開方法は何ですか
1.1ネットワーク規模を縮小してから移植する
一般的に、私たちがトレーニングするモデルの規模は非常に大きいです。MobileNetと同様の方法があり、軽量のニューラルネットワークに直接構築され、ユーザー端末やその他の組み込みハードウェアのモバイルデバイスに直接移植されます。一部の大規模ネットワークは整理され、簡略化されたモデルとして保存されます。このようにして得られたモデルの精度は、元のネットワークの精度よりもそれほど悪くはありませんが、同時に、計算のオーバーヘッドを大幅に削減し、実行速度を上げることができます。
ただし、これはある程度の精度の低下と同じくらい単純であるだけでなく、モデルの剪定プロセスも非常に面倒であり、剪定の方法と範囲を決定するのに多くの作業が必要です。さらに、モデルにはまだ移植の問題があります。PyTorchでトレーニングされたモデルは、TensorFlowよりも多くの作業を必要とし、Googleには「TensorFlowファミリーバケット」があるため、他のフレームワークはさらに多くの作業を必要とします。TensorFlowは、効率的なモデル推論のためのGo言語をサポートするライブラリと、モデルをモバイル側で実行するためのLiteバージョン(TensorLite)を正式にリリースします。また、Pythonに加えて、Java、Swift、Object-Cをサポートします。他の言語。それでも、移行プロセスは非常に面倒で、TensorFlowのドキュメントを頻繁に参照する必要があり、ハードウェアデバイスとの互換性の問題がまだあります。
要するに、どのようにやっても、問題を解決するためにたくさんの新しい問題を導入することと同じであり、どのように見ても価値がありません。
1.2デバイス専用のハードウェアを使用する
この方法は、インターネットアクセスが禁止されている環境やインターネットアクセスが不可能な環境に最適です。(2つの意味で)インターネットに接続できない場所はありますか?誰もがすべてを理解しています。ネットワークの制限がなくなると、専用のハードウェアを使用することは費用効果が高くありません。現在最も重要なことは、高い包括的コストと低コストのパフォーマンスです。前のセクションで説明したモデル移植のコストだけでなく、ハードウェアコストの問題。現在、専用ハードウェアのコストは比較的高いです。一般的にGPUよりも高速であると言われていますが、専用ハードウェアは通常のGPUよりも高価ですが、ディープラーニングモデルの計算にしか使用できないため、プログラミングを移植するときにハードウェアに適合させる必要があります。典型的な例はFPGAであり、一部の企業の関連する専用ハードウェアのコストが非常に高いことが理解されています。
1.3ネットワークに基づくクラウドコンピューティングにC / Sアーキテクチャを使用する
「C / S」アーキテクチャソフトウェアアーキテクチャ「クライアント/サーバ」アーキテクチャにおける古典的なアーキテクチャモデルである典型的なC / Sアーキテクチャは、多くの場合、MVCモデルを使用し、即ち:モデル(Mのodel)、ビュー(VのIEW) 、コントローラ(Cのontroller)。
図1MVCモードの概略図
以下は、新人チュートリアルのMVCパターンの説明です。
モデル -モデルは、データにアクセスするオブジェクトまたはJAVAPOJOを表します。また、データが変更されたときにコントローラーを更新するロジックを持つこともできます。
ビュー -ビューは、モデルに含まれるデータの視覚化を表します。
コントローラ -コントローラはモデルとビューに作用します。モデルオブジェクトへのデータの流れを制御し、データが変更されたときにビューを更新します。ビューをモデルから分離します。
ここでは詳しく説明しません。MVCの詳細については、元のテキストを参照してください:https://www.runoob.com/design-pattern/mvc-pattern.html
ネットワークとC / Sアーキテクチャを使用することで、完全なディープラーニングモデルの計算を高性能サーバーにデプロイできます。クライアントは、AIがもたらす利便性を享受するために、高価な機器を使用したりネットワークに接続したりする必要がありません。このように、クラウドに導入する必要があるのは少数の高性能コンピューティングサーバーのみであり、多数の安価なハードウェアと機器でモデルの計算と推論を使用でき、全体的なコストは非常に低くなります。この展開方法により、クライアント側で大量の高価なハードウェアが不要になり、アイドル状態のコンピューティングリソースの浪費が回避され、モデル移植のための人的資源と材料リソースのコストが回避されます。
2HTTPサービスを使用する理由
ディープラーニングモデルの展開として、ネットワーク化されたC / Sアーキテクチャを使用する必要があると判断しました。また、C / Sアーキテクチャには多くの特定の実装があります。また、AIレモンブロガーはHTTPプロトコルの使用を推奨しています。これをする。なぜHTTPプロトコルなのですか?
HTTPプロトコルは、ほとんどすべてのシナリオで最も広く使用され、最も互換性があり、機能的に適用可能なアプリケーション層ネットワークプロトコルであるためです。さまざまな形式のブラウザベースのWebサイトがその例ですが、ブラウザベースのWebサイトには「B / S」アーキテクチャ、つまり「ブラウザ/サーバー」アーキテクチャがあり、ここではC / Sアーキテクチャについてのみ説明します。
2.1HTTPとは
HTTPは、TCP / IPプロトコルに基づくアプリケーション層プロトコルであるハイパーテキスト転送プロトコル(ハイパーテキスト転送プロトコル)であり、一般に接続レスおよびステートレスと見なされます。HTTPプロトコルには、クエリ、追加、変更、削除の操作に対応するGET、POST、PUT、DELETEなどのリクエストメソッドがあります。最初の2つが最も一般的に使用されます。通常、GETリクエストを使用してウェブページを開きます。登録やログイン、記事やコメントの公開など、送信するデータがある場合、GETリクエストには最大URL長の制限があるため、POSTリクエストを使用します。通常はしません。したがって、POSTリクエストを使用して写真、音声、動画などのデータをサーバーにアップロードしてから、サーバーがディープラーニング計算を実行して結果を返すのが最適です。
HTTPは通常、コネクションレス型およびステートレス型ですが、ユーザー登録やログインなど、必要に応じてステートフルとして実装することもできます。ログイン後、自分のアカウントを使用して記事やコメントを投稿できることは誰もが知っています。そして、この種の接続と状態は、HTTPプロトコルのCookieとセッションを介して実現できます。Cookieはユーザー側(ブラウザ側など)に保存され、セッションはサーバー側に保存されます(HTTPサービスソフトウェアまたはデータベースを使用できます)。通常、この2つは一緒に使用されます。
多数の深層学習モデルの計算では、通常、コンテキストに依存しません。たとえば、画像1のすべての人と、画像2のすべての人を識別するために、通常、コンテキスト関連の状態を実現するためにCookieやセッションを使用する必要はありません。と接続。ただし、必要な場合もあります。たとえば、機械の質問応答システムでは、通常、過去の期間におけるユーザーとの会話の内容のコンテキストや、長くて長いテキストの音声認識を考慮する必要があります。現時点では、接続されたステートフルな処理を実行できます。これもCookie +セッションのみが必要です。
2.2HTTPプロトコルに基づくデプロイメントの利点
AIレモンブロガーは、HTTPが広く使用されており、ほとんどすべてのコンパイラに利用可能なライブラリ実装があり、プロトコルが標準化されており、一貫性のないプロトコル実装の問題はなく、時間と実践のテストに合格しており、多数の既製のソフトウェアとライブラリ。また、HTTPプロトコルを使用すると、追加のコードを記述しなくても、弾力性のあるスケーリングを簡単に実現できます。既製のNginxサーバーは、構成ファイルの完全なセットを使用して実行できます。
図2高性能ディープラーニング推論コンピューティングサーバークラスターアーキテクチャの概略図
たとえば、ディープラーニングモデルの計算のためにHTTPサーバーを起動します。1台のサーバーでは不十分な場合は、100を起動し、IPアドレスを192.168.1.100〜192.168.1.199に設定します(または、100の異なるポートを監視できます。同じマシン、優れたサーバーパフォーマンスが必要です)、次にこれらの100個のIPアドレスを入力し、Nginxを使用してUpStreamを介してこれらの100個のサーバーを逆プロキシし、ポーリングによって各計算要求をこれらの100個のサーバーの1つに転送します。認識に1秒かかる場合、サーバーは1秒に1回しか認識できません。Nginxの負荷分散後、このようなサーバークラスターは1秒に100回認識できるため、スループット率が1から100に増加します。AIレモンブロガーは現在、ASRT音声認識APIサーバーを展開するときにこの方法を使用しています。バックエンドに複数の(N)サーバーが展開されているため、音声認識のスループット率が元のN倍に向上します。
したがって、C / Sアーキテクチャを介して、サーバーにディープラーニング推論計算をデプロイするだけで済み、他の機能の実装は引き続きターミナルに保持されるため、AIアルゴリズムモデルを低コストで実装できます。コストと高効率モデル。クラウドコンピューティングと組み合わせると、企業の総コストをさらに削減できます。
2.3プライベートアプリケーションプロトコルの使用が推奨されないのはなぜですか
プライベートアグリーメントが推奨されない主な理由は、それがプライベートアグリーメントであり、企業のソフトウェアエンジニアリングの開発および管理機能に特定の要件があるためです。TCP / IPに基づいて新しいプロトコルを再開発すると欠陥が発生しやすく、プロトコルの欠陥によりさまざまな問題が発生し、プロトコルバージョンの更新によって互換性の問題が発生する可能性が高くなります。十分な開発能力がある場合は、試すことができます。
3DjangoとFlaskの代わりにネイティブHTTPライブラリを使用することが推奨されるのはなぜですか
DjangoとFlaskは、それぞれ2005年と2010年にリリースされたWebサイト開発用のPythonライブラリです。これら2つのフレームワークには、特定の使用法と追加の学習コストがあります。APIサーバーとして、多くの機能に注意を払う必要はありません。PythonネイティブHTTPライブラリを直接使用して、GETおよびPOSTリクエストを処理するためのメソッドを実装するためにHTTPサービスサブクラスコードを記述するだけで済みます。構文はまだよく知られています。
4 PythonはサンプルHTTPサービスプログラムを実装し、IPv6をサポートします
このセクションでは、Pythonを使用してAPIリクエストを処理し、IPv6プロトコルをサポートするHTTPサーバーのデモを紹介します。
apiserver.py
#!/ usr / bin / env python3
#-*-コーディング:utf-8-*-
"" "
@author:AIレモン
深層学習モデルAPIのHTTPサーバープログラム
"" "
http.serverをインポートします
urllibをインポートする
クラスTestHTTPHandle(http.server.BaseHTTPRequestHandler):
def setup(self):
self.request.settimeout(10)#タイムアウト時間を10秒に設定します
http.server.BaseHTTPRequestHandler.setup(self)
def _set_response(self):
self.send_response(200)#HTTPサーバー要求ステータスを設定します200
self.send_header( 'Content-type'、 'text / html')#HTTPサーバーリクエストのコンテンツ形式を設定します
self.end_headers()
def do_GET(self):
buf = 'AIレモンディープラーニングモデルコンピューティングAPIサービス'
self.protocal_version = 'HTTP / 1.1'
self._set_response()
buf = bytes(buf、encoding = "utf-8")#コーディング変換
self.wfile.write(buf)#返されたコンテンツを書き出す
def do_POST(self):
'' '
POSTを介して送受信された入力データを処理し、結果を計算して返します
'' '
path = self.path#要求されたURLパスを取得します
print(path)
#郵送で提出されたデータを取得する
datas = self.rfile.read(int(self.headers ['content-length']))
#datas = urllib.unquote(datas).decode( "utf-8"、 'ignore')
日付= dates.decode( 'utf-8')
'' '
入力データは変数「datas」に格納されており、深層学習計算などの処理コードを挿入できます。
計算結果が変数「buf」に格納されているとします。
'' '
self._set_response()
buf = bytes(buf、encoding = "utf-8")
self.wfile.write(buf)#戻り結果をクライアントに書き込みます
IPv6プロトコルサポートの変換を有効にするには、上記のコードの後に次を追加します。
インポートソケット
クラスHTTPServerV6(http.server.HTTPServer):
address_family = socket.AF_INET6
def start_server(ip、port):
if( ':' in ip):
http_server = HTTPServerV6((ip、port)、TestHTTPHandle)
そうしないと:
http_server = http.server.HTTPServer((ip、int(port))、TestHTTPHandle)
print( 'サーバーがオンになっています')
試してください:
http_server.serve_forever()#常にリクエストを監視および受信するように設定
KeyboardInterruptを除く:
パス
http_server.server_close()
print( 'HTTPサーバーが閉じています')
このHTTPServerV6は、IPv6プロトコルをサポートするサーバープログラムです。純粋なIPv4とIPv6を切り替えるには、start_server()関数を起動エントリとして実装し、サーバーを起動する場所で呼び出すだけです。プログラム。それ。例えば:
if __name__ == '__ main __':
start_server( ''、20000)#IPv4ネットワークのみ
#start_server( '::'、20000)#IPv6ネットワークの場合
5アプリケーション例:ASRT音声認識APIサーバーはどのように機能しますか?
APIサーバープログラムを実装するためのASRT音声認識システムのコードは次のとおりです。
https://github.com/nl8590687/ASRT_SpeechRecognition/blob/master/asrserver.py
上記のように、最初にHTTPサーバークラスのコードの外にディープラーニングに関連する初期化コードを追加します。
ハードインポート
SpeechModel251からModelSpeechをインポートします
LanguageModelからインポートModelLanguage
datapath = '。/'
modelpath = 'model_speech /'
ms = ModelSpeech(datapath)
ms.LoadModel(modelpath + 'm251 / Speech_model251_e_0_step_12000.model')
ml = ModelLanguage( 'model_language')
ml.LoadModel()
次に、POSTリクエストの処理によって取得された入力データの後に深層学習計算コードを追加します。
#新しい関数を開かないように、前のコードを接続します
def Recognition(wavs、fs):
r = ''
試してください:
r_speech = ms.RecognizeSpeech(wavs、fs)
print(r_speech)
str_pinyin = r_speech
r = ml.SpeechToText(str_pinyin)
例外:
r = ''
print( '[*メッセージ]サーバーでバグが発生しました。')
rを返す
パス
datas_split = datas.split( '&')
トークン= ''
fs = 0
wavs = []
#type = 'wavfilebytes'#wavfilebytesまたはpython-list
datas_splitの行の場合:
[キー、値] = line.split( '=')
if( 'wavs' == key and ''!= value):
wavs.append(int(value))
elif( 'fs' == key):
fs = int(value)
elif( 'token' == key):
トークン=値
#elif( 'type' == key):
#タイプ=値
そうしないと:
print(key、value)
if(token!= 'qwertasd'):
buf = '403'
print(buf)
buf = bytes(buf、encoding = "utf-8")
self.wfile.write(buf)
戻る
#if( 'python-list' == type):
if(len(wavs)> 0):
r = self.recognize([wavs]、fs)
そうしないと:
r = ''
#そうしないと:
#r = self.recognize_from_file( '')
if(token == 'qwertasd'):
#buf = '成功\ n' + 'wavs:\ n' + str(wavs)+ '\ nfs:\ n' + str(fs)
buf = r
そうしないと:
buf = '403'
これについて言えば、このHTTPサーバープログラムで実行するディープラーニングコードを変更する方法を尋ねられる場合があります。コードを再構築するのは非常に難しい場合があります。これは、コードが悪すぎて構造が十分に合理的でないことを示しているだけです。それを書くこのコードを持つ人々は、エレガントに構造化されたプログラミング、特に最初から最後まで実行される種類のpythonコードファイルの方法を学ぶ必要があります。ディープラーニングを行う人の多くは、コードを書くことしかできず、プログラミングを理解していません。したがって、アルゴリズムを実装すると、ソフトウェアアーキテクチャが混乱し、バックエンド開発にも当てはまります。
6エラスティックスケーリングの問題:APIリクエストの数が急激に増加した場合はどうすればよいですか
2つの言葉:拡張。リクエストの増加に直面して、最初に考えるべきことは、サーバーをより優れたコンピューティングパフォーマンスに置き換えるなど、垂直方向の拡張ではなく、サーバーの水平方向の拡張です。図2に示すように、バックエンドのASRT音声認識APIサーバーの数を増やすだけで済みます。現在、クラウドコンピューティングプラットフォームに基づいて、そのような問題に自動的に対処するのに役立つ自動化された運用および保守ツールと製品がすでにあります。緊急でない場合は、ソフトウェアの観点からディープラーニングモデルを含むさまざまなアルゴリズムを徐々に最適化して、プログラムの最大パフォーマンスと時間オーバーヘッドのボトルネックを見つけ、プログラムの実行速度を高速化し、単一の時間オーバーヘッドを削減します。操作。
7まとめ
この記事では、主にディープラーニングモデルをデプロイするための最良の方法を紹介します。最初に、ディープラーニングモデルの展開で一般的に使用される3つの方法を紹介し、それぞれの特性について説明します。次に、HTTPプロトコルとその利点を紹介し、次にPythonを使用してディープラーニングモデル計算APIサービス用のHTTPライブラリに基づくHTTPサーバープログラムを実装する方法を紹介し、次にASRT音声認識システムTakeを使用してコードを実装する方法を紹介しました。例えば。最後に、増え続けるAPIリクエストの量に対処する方法についても説明しました。これは、緊急時にサーバーを水平方向にスケーリングし、通常の時間にボトルネックを最適化することです。
著作権表示 このブログの記事は、特に明記されていない限りオリジナルであり、私は著作権で保護されています。転載へようこそ、著者とソースリンクを示してください、ありがとう。 この記事のアドレス:https: //blog.ailemon.me/2020/11/09/dl-best-deployment-python-impl-http-api-server/ すべての記事はAttribution-NonCommercial-ShareAlike4.0の下にあります |