機械学習タスクを実行するときは、コードを使用してモデルのメモリ使用量をすばやく確認する方法を学ぶ必要があります。理由は簡単です。ハードウェア リソースは限られており、単一の機械学習モジュールがシステムのすべてのメモリを占有してはいけません。これはエッジ コンピューティングのシナリオでは特に重要です。 たとえば、優れた機械学習プログラムを作成したり、優れたニューラル ネットワーク モデルを構築したりした後、そのモデルを 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% 削減、畳み込み層に「ピクセルの選択」を教える
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
2020年は、厳しい防疫活動のさなか、静かに過ぎていきました。今年も人工知能の進歩は止まりませんでし...
WeChatミニプログラムにゲーム「Jump Jump」が登場して以来、多くのWeChatユーザーが...
今日は、実際の戦闘でよく使われる26のヒントを紹介します。これにより、出力がより効果的になります。見...
「思考の連鎖(CoT)」の概念を注意深く研究したことがあるなら、おそらく Jason Wei とい...
2023年、生成AI技術が繭から現れ、世界的なデジタル革命を引き起こしました。初期のチャットやチェス...
機械学習やコンピューター ビジョンのプロジェクトで、画像の品質が低いという問題に遭遇したことはありま...
[[428092]]現在、AI の大きなトレンドは何ですか?そうです、データセットのサイズを拡大し...
PyTorch から Mxnet まで、これらの Python ディープラーニング フレームワークを...
人工知能 (AI) は研究プロセスにおいてますます重要な役割を果たしています。 AI ベースのアルゴ...
ディープラーニングアルゴリズムは、マシンビジョンにおける巧妙な受信機コンバーターのようなものです。柔...