機械学習タスクを実行するときは、コードを使用してモデルのメモリ使用量をすばやく確認する方法を学ぶ必要があります。理由は簡単です。ハードウェア リソースは限られており、単一の機械学習モジュールがシステムのすべてのメモリを占有してはいけません。これはエッジ コンピューティングのシナリオでは特に重要です。 たとえば、優れた機械学習プログラムを作成したり、優れたニューラル ネットワーク モデルを構築したりした後、そのモデルを Web サービスまたは REST API にデプロイしたいとします。あるいは、工場のセンサーからのデータストリーミングに基づくモデルを開発し、それを産業用コンピューターの 1 つに展開する予定である場合もあります。 この時点で、あなたのモデルはハードウェア上で実行されている数百のモデルのうちの 1 つである可能性があるため、ピーク時のメモリ使用量に注意する必要があります。そうしないと、複数のモデルが同時にメモリ使用量のピークに達し、システムがクラッシュする可能性があります。 したがって、実行中のコードのメモリ プロファイル (動的量) を理解することは非常に重要です。これはモデルのサイズや圧縮とは関係なく、Scikit-learn Joblib ダンプ、Python Pickle ダンプ、TensorFlow HFD5 など、事前にディスクに保存した特別なオブジェクトの可能性があります。 Scalene: シンプルなメモリ/CPU/GPU プロファイラー最初に取り上げるのは、マサチューセッツ大学で開発された Python 用の高性能 CPU およびメモリ プロファイラーである Scalene です。 GitHub ページでは次のように説明されています。「Scalene は、Python 用の高性能な CPU、GPU、メモリ プロファイラーです。他の Python プロファイラーではできない多くの機能を備えており、他のプロファイラーよりも桁違いに高速に詳細な情報を提供します。」 インストール これは Python パッケージなので、通常どおりインストールします。
これは Linux OS で動作しますが、著者は Windows 10 ではテストしていません。 CLIまたはJupyter Notebook内から使用する Scalene の使い方は非常に簡単です:
マジックコマンドを使用して、Jupyter ノートブックで使用することもできます。
出力例 以下は出力の例です。これについては後でさらに詳しく説明します。 Scalene の優れた機能は次のとおりです。
MLコードの例次に、標準的な機械学習コードのメモリ内構成に関する Scalene の取り組みを見てみましょう。 3 つのモデルには Scikit-learn ライブラリが使用され、その包括的なデータ生成機能を利用してデータセットが作成されました。 2 つの異なるタイプの ML モデルを比較します。
線形回帰モデル 標準インポートと 2 つの変数 NUM_FEATURES および NUM_SMPLES を使用していくつかの実験を行います。 データ生成とモデルフィッティングのコードはここには示されていませんが、かなり標準的です。著者らは、適合モデルをピクルスダンプとして保存し、推論のためにテスト CSV ファイルとともにロードしました。 わかりやすくするために、すべてが Scalene 実行およびレポート環境内のループ内に配置されます。 コマンドを実行する場合:
これらの結果は出力として提供されます。ここでは --html フラグが使用されており、レポート作成を容易にするために出力が HTML ファイルにパイプされることに注意してください。 驚くべきことに、メモリ使用量は、外部 I/O (Pandas や Scikit-learn 推定器の読み込みなど) によってほぼ完全に占められており、テスト データをディスク上の CSV ファイルに書き込む量はわずかです。実際の ML モデリング、Numpy、Pandas 操作、および推論はメモリにまったく影響しません。 データセットのサイズ (行数) とモデルの複雑さ (機能の数) をスケーリングし、同じメモリ プロファイルを実行して、メモリ消費の観点からさまざまな操作がどのように実行されるかを記録できます。結果はここに表示されます。 ここで、X 軸は特徴/データ ポイントのセットを表します。グラフは、さまざまなタイプの操作の相対的な重要性を示すために、絶対値ではなくパーセンテージで表されていることに注意してください。 これらの実験から得られた結論は、Scikit-learn 線形回帰推定器は非常に効率的であり、実際のモデルフィッティングや推論に多くのメモリを消費しないということです。 しかし、コードに関する限りメモリフットプリントは固定されており、ロード時に大量のメモリを消費します。ただし、データ サイズとモデルの複雑さが増すにつれて、全体的なコード使用率は低下します。このようなモデルを使用する場合は、データ ファイルの I/O に重点を置き、コードを最適化してメモリ パフォーマンスを向上させることをお勧めします。 ディープニューラルネットワークについてはどうでしょうか? 各隠し層に 50 個のニューロンを持つ 2 つの隠し層ニューラル ネットワークを使用して同様の実験を実行すると、結果は次のようになります。 コードアドレス: https://github.com/tirthajyoti/Machine-Learning-with-Python/blob/master/Memory-profiling/Scalene/mlp.py 線形回帰モデルとは異なり、ニューラル ネットワーク モデルはトレーニング/フィッティングのステップで大量のメモリを消費します。ただし、特徴の数が少なく、データの量が多いため、フィッティングに必要なメモリは少なくなります。さらに、さまざまなアーキテクチャとハイパーパラメータを試して、適切な設定に達するまでメモリ使用量を記録することもできます。 複製に関する指示同じコードを使用して実験を再現する場合、ハードウェア、ディスク/CPU/GPU/メモリの種類によって結果が大きく異なる可能性があります。 いくつかの重要な推奨事項
Parquet ファイル (Arrow を使用) の読み取りと Pandas を使用した CSV の読み取りの速度はどれくらいですか? https://towardsdatascience.com/how-fast-is-reading-parquet-file-with-arrow-vs-csv-with-pandas-2f8095722e94 Scaleneができること この記事では、機械学習モデリングコードの標準化に焦点を当てて、メモリ分析のごく一部についてのみ説明しました。実際、Scalene CLI には使用できる他のオプションもあります。
最終検証(オプション) リソースが少ない場合は、特定のモデリング コード (開発済み) を取得し、メモリ プロファイラーを介して実行して実行時統計を作成する検証環境/サーバーをホストする方が適切です。モデリング コードは、メモリ フットプリントの所定の基準を満たしている場合にのみ、さらに展開するために受け入れられます。 要約するこの記事では、機械学習コードのメモリプロファイリングの重要性について説明しました。プラットフォームやエンジニアリング チームが簡単に使用できるように、サービスやマシンでより適切に展開できるようにする必要があります。メモリを分析すると、特定のデータやアルゴリズムのより効率的な最適化を見つけるのにも役立ちます。 これらのツールとテクニックを機械学習の導入に活用して成功されることを願っています。 |
<<: AI はどのようにしてよりスマートな建物を作り出すのでしょうか?
>>: Qualcomm CVPR 研究: ビデオ処理の計算を 78% 削減、畳み込み層に「ピクセルの選択」を教える
[[412098]] [51CTO.com クイック翻訳]キャピタル・ワンのモバイル、ウェブ、会話型...
マスクが翻訳機の仕事を引き継ごうとしている。 最近、日本のスタートアップ企業が、マスクを着けていると...
強化学習となると、多くの研究者のアドレナリンが抑えきれないほど湧き上がります!これは、ゲーム AI ...
最近、大規模言語モデル (LLM) はさまざまなタスクで優れたパフォーマンスを示しています。しかし、...
最近、インテルの研究者らは、新しい小さな「スピン量子ビット」チップをテストしていることを明らかにした...
事前のプログラミングやトレーニングなしで GPT-4 を使用してヒューマノイド ロボットを制御すると...
スマートスピーカー、スマートフォン、スマートブレスレット、スマートエアコンなどのデバイスを購入するこ...
現在、5G に関するブログやベンダーの論文が数多くあり、新しいメディア伝送からギガビット速度、モバイ...
被験者が特定の行動をとったとき、その脳はそれに対応する安定した脳神経パターンのマッピングを生成するで...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...