あなたが書いた ML コードはどれくらいのメモリを占有しますか?これはとても重要なことですが、多くの人がまだそれを理解していません。

あなたが書いた ML コードはどれくらいのメモリを占有しますか?これはとても重要なことですが、多くの人がまだそれを理解していません。

[[405865]]

機械学習タスクを実行するときは、コードを使用してモデルのメモリ使用量をすばやく確認する方法を学ぶ必要があります。理由は簡単です。ハードウェア リソースは限られており、単一の機械学習モジュールがシステムのすべてのメモリを占有してはいけません。これはエッジ コンピューティングのシナリオでは特に重要です。

たとえば、優れた機械学習プログラムを作成したり、優れたニューラル ネットワーク モデルを構築したりした後、そのモデルを 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 パッケージなので、通常どおりインストールします。

  1. pip インストール スケーレン

これは Linux OS で動作しますが、著者は Windows 10 ではテストしていません。

CLIまたはJupyter Notebook内から使用する

Scalene の使い方は非常に簡単です:

  1. 斜角面 <yourapp.py>

マジックコマンドを使用して、Jupyter ノートブックで使用することもできます。

  1. %load_ext 不等辺三角形

出力例

以下は出力の例です。これについては後でさらに詳しく説明します。

Scalene の優れた機能は次のとおりです。

  • 行と関数: 関数全体と各コード行に関する情報を報告します。
  • スレッド: Python スレッドをサポートします。
  • マルチプロセス処理: マルチプロセスライブラリの使用をサポートします。
  • Python と C の時間: Scalene が Python に費やす時間とネイティブ コード (ライブラリなど) に費やす時間。
  • システム時間: システム時間 (スリープ中や I/O 操作の実行中など) を区別します。
  • GPU: NVIDIA GPU に費やされた時間を報告します (利用可能な場合)。
  • レプリケーション ボリューム: 1 秒あたりにレプリケートされるデータの量を報告します。
  • リーク検出: メモリ リークの原因となっている可能性のある行を自動的に特定します。

MLコードの例

次に、標準的な機械学習コードのメモリ内構成に関する Scalene の取り組みを見てみましょう。 3 つのモデルには Scikit-learn ライブラリが使用され、その包括的なデータ生成機能を利用してデータセットが作成されました。

2 つの異なるタイプの ML モデルを比較します。

  • 多重線形回帰モデル;
  • 同じデータセットを使用したディープ ニューラル ネットワーク モデル。

線形回帰モデル

標準インポートと 2 つの変数 NUM_FEATURES および NUM_SMPLES を使用していくつかの実験を行います。

データ生成とモデルフィッティングのコードはここには示されていませんが、かなり標準的です。著者らは、適合モデルをピクルスダンプとして保存し、推論のためにテスト CSV ファイルとともにロードしました。

わかりやすくするために、すべてが Scalene 実行およびレポート環境内のループ内に配置されます。

コマンドを実行する場合:

  1. $ スケールネ linearmodel.py --html >> linearmodel-scalene.html

これらの結果は出力として提供されます。ここでは --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/メモリの種類によって結果が大きく異なる可能性があります。

いくつかの重要な推奨事項

  • コード内に単一のタスクに重点を置いた小さな関数を記述する方がよいでしょう。
  • 特徴やデータ ポイントの数などの自由変数をいくつか保持し、最小限の変更で同じコードを実行し、データ/モデルがスケーリングされたときにメモリ プロファイルをチェックします。
  • ある ML アルゴリズムを別の ML アルゴリズムと比較する場合は、混乱を減らすために、コード全体の構造とフローをできるだけ同じに保ちます。推定クラスを変更してメモリ プロファイルを比較するのが最善です。
  • モデリング シナリオによっては、データとモデルの I/O (インポート ステートメント、ディスク上のモデルの永続性) が予期せずメモリ使用量を占める場合があり、最適化時に無視しないでください。
  • 同じ理由で、複数の実装/パッケージ (Keras、PyTorch、Scikitlearn など) からの同じアルゴリズムのメモリ プロファイルを比較することを検討してください。メモリの最適化が主な目的である場合、機能やパフォーマンスの点で最適ではないとしても、メモリの使用量を最小限に抑え、ジョブを満足に実行できる実装を見つける必要があります。
  • データ I/O がボトルネックになる場合は、Pandas CSV を parquet ファイルと Apache Arrow ストレージに置き換えるなど、より高速なオプションや他のストレージ タイプを検討してください。この記事を読むことができます:

Parquet ファイル (Arrow を使用) の読み取りと Pandas を使用した CSV の読み取りの速度はどれくらいですか?

https://towardsdatascience.com/how-fast-is-reading-parquet-file-with-arrow-vs-csv-with-pandas-2f8095722e94

Scaleneができること

この記事では、機械学習モデリングコードの標準化に焦点を当てて、メモリ分析のごく一部についてのみ説明しました。実際、Scalene CLI には使用できる他のオプションもあります。

  • メモリではなく CPU 時間のみを分析します。
  • リソース使用量を削減するために、ゼロ以外のメモリのみを使用します。
  • CPU とメモリの割り当ての最小しきい値を指定します。
  • CPU サンプリング レートを設定します。
  • 並列でマルチスレッドを実行し、差異をチェックします。

最終検証(オプション)

リソースが少ない場合は、特定のモデリング コード (開発済み) を取得し、メモリ プロファイラーを介して実行して実行時統計を作成する検証環境/サーバーをホストする方が適切です。モデリング コードは、メモリ フットプリントの所定の基準を満たしている場合にのみ、さらに展開するために受け入れられます。

要約する

この記事では、機械学習コードのメモリプロファイリングの重要性について説明しました。プラットフォームやエンジニアリング チームが簡単に使用できるように、サービスやマシンでより適切に展開できるようにする必要があります。メモリを分析すると、特定のデータやアルゴリズムのより効率的な最適化を見つけるのにも役立ちます。

これらのツールとテクニックを機械学習の導入に活用して成功されることを願っています。

<<:  AI はどのようにしてよりスマートな建物を作り出すのでしょうか?

>>:  Qualcomm CVPR 研究: ビデオ処理の計算を 78% 削減、畳み込み層に「ピクセルの選択」を教える

ブログ    

推薦する

...

...

2020年のAI技術のブレークスルーをすべて見る

2020年は、厳しい防疫活動のさなか、静かに過ぎていきました。今年も人工知能の進歩は止まりませんでし...

AIとCVで「Jump Jump」をプレイし、張小龍の最高スコア6000以上を上回った

WeChatミニプログラムにゲーム「Jump Jump」が登場して以来、多くのWeChatユーザーが...

...

ChatGPT を成功させるための 26 のスーパーヒント

今日は、実際の戦闘でよく使われる26のヒントを紹介します。これにより、出力がより効果的になります。見...

大学卒業後、彼はGoogleに入社し、先駆的な作品「Thinking Chain」を執筆した。このOpenAIの新人は、学部生の質問に答えている。

「思考の連鎖(CoT)」の概念を注意深く研究したことがあるなら、おそらく Jason Wei とい...

ジェネレーティブAIは企業にとって新たなリスクとなっているが、重要な問題を放置すべきではない

2023年、生成AI技術が繭から現れ、世界的なデジタル革命を引き起こしました。初期のチャットやチェス...

Python による画像前処理の完全ガイド

機械学習やコンピューター ビジョンのプロジェクトで、画像の品質が低いという問題に遭遇したことはありま...

...

Google Research の最新の発見: トレーニング結果が不正確になるのは、データ規模が巨大すぎることが原因です。

[[428092]]現在、AI の大きなトレンドは何ですか?そうです、データセットのサイズを拡大し...

Pythonディープラーニングフレームワークの比較の詳細な分析

PyTorch から Mxnet まで、これらの Python ディープラーニング フレームワークを...

人工知能は研究をどのように変えているのでしょうか?

人工知能 (AI) は研究プロセスにおいてますます重要な役割を果たしています。 AI ベースのアルゴ...

ディープラーニングアルゴリズム

ディープラーニングアルゴリズムは、マシンビジョンにおける巧妙な受信機コンバーターのようなものです。柔...