あなたが書いた 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% 削減、畳み込み層に「ピクセルの選択」を教える

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

AI+医療:医療を救うには医師が率先して行動しなければならない

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

自然言語処理におけるAIの未来を探る

自然言語処理 (NLP) 機能の向上により、認知機能と人間同士のやり取りが向上し、それが AI の将...

顔認識システムはすごいですね!チケット転売業者が体調を崩して入院、警戒を呼び起こす

最近、北京同仁病院の警報システムが作動し、職員は北京天壇病院で活動していたチケット転売業者が北京同仁...

ボストン住宅データセットに基づくシンプルなMLP回帰モデルのトレーニング

[[422501]]多層パーセプトロン(MLP)は非常に長い歴史を持っています。多層パーセプトロン(...

人工知能は人間のように学習できるのでしょうか?

1956 年の夏、米国のダートマス大学で開催された学術会議で、「人工知能」という用語が初めて提案さ...

...

ディープラーニングによる物体検出モデルの包括的なレビュー: 高速 R-CNN、R-FCN、SSD

[[204169]] Faster R-CNN、R-FCN、SSD は、最も人気があり、広く使用さ...

最高裁:コミュニティへの出入りの際の唯一の確認方法として顔認証を強制すべきではない

出典: @CCTVニュース【最高裁:顔認証は、居住コミュニティの入退出の唯一の確認方法として強制して...

チャットボットのテスト: フレームワーク、ツール、テクニックの詳細

[[425133]] [51CTO.com クイック翻訳]長年にわたり、ビジネス マーケティングの動...

...

人工知能はあらゆる産業に革命を起こすだろう

今日のさまざまな業界における人工知能の影響を見てみましょう。 [[421328]] 1. 自動車産業...

...

テスラは最初にこの問題の矢面に立たされ、自動運転の安全性の問題が再び話題となっている。

今日、自動運転は自動車産業の発展と変革の重要な方向性の一つとなっています。自動運転技術が成熟するにつ...

「行動は言葉よりも雄弁である」:言語モデルはロボットにどのように適応するのか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...