ホームページ >テクノロジー周辺機器 >AI >ディープラーニングCPUベンチマーク
ディープラーニングGPUベンチマークは、画像認識から自然言語処理まで、複雑な問題を解決する方法に革命をもたらしました。ただし、これらのモデルのトレーニングはしばしば高性能GPUに依存しているが、限られたハードウェアを備えたエッジデバイスやシステムなどのリソース制約のある環境で効果的に展開することで、独自の課題が発生します。 CPUは、広く利用可能で費用効率が高いため、そのようなシナリオで推論のバックボーンとして機能します。しかし、CPUに展開されたモデルが精度を損なうことなく最適なパフォーマンスを提供することをどのように保証するのでしょうか?
この記事では、CPUのディープラーニングモデルの推論のベンチマークに分かれており、3つの重要なメトリックに焦点を当てています。スパム分類の例を使用して、Pytorch、Tensorflow、Jax、ONNXランタイムハンドルの推論ワークロードなどの人気のあるフレームワークをどのように検討します。最後に、パフォーマンスを測定し、展開を最適化し、リソース制約の環境でCPUベースの推論に適したツールとフレームワークを選択する方法を明確に理解することができます。
影響:最適な推論の実行は、かなりの金額を節約し、他のワークロードのリソースを解放することができます。
この記事は、データサイエンスブログソンの一部として公開されました。
推論速度は、機械学習アプリケーションのユーザーエクスペリエンスと運用効率に不可欠です。ランタイム最適化は、実行を合理化することにより、これを強化する上で重要な役割を果たします。 ONNXランタイムのようなハードウェアアクセラル化ライブラリを使用すると、特定のアーキテクチャに合わせた最適化を利用して、遅延(推論あたりの時間)を削減します。
さらに、ONNXなどの軽量モデル形式はオーバーヘッドを最小限に抑え、より速いロードと実行を可能にします。最適化されたランタイムは、利用可能なCPUコア全体に計算を分配し、メモリ管理を改善するための並列処理を活用し、特にリソースが限られているシステムのパフォーマンスを向上させます。このアプローチは、精度を維持しながら、モデルをより速く、より効率的にします。
モデルのパフォーマンスを評価するために、3つの重要なメトリックに焦点を当てます。
このベンチマーク研究を焦点を合わせて実用的に保つために、次の仮定を行い、いくつかの境界を設定しました。
これらの仮定により、ベンチマークは、リソースに制約のあるハードウェアを扱う開発者とチーム、または分散システムの複雑さを追加せずに予測可能なパフォーマンスを必要とする人に関連することを保証します。
CPUの深い学習モデルの推論をベンチマークして最適化するために使用される重要なツールとフレームワークを調査し、リソースに制約のある環境で効率的な実行の機能に関する洞察を提供します。
以下の構成でGitHub CodeSpace(Virtual Machine)を利用しています。
使用されるパッケージのバージョンは次のとおりであり、このプライマリには5つの深い学習推論ライブラリが含まれます:Tensorflow、Pytorch、Onnx Runtime、Jax、およびOpenVino:
!ピップインストールnumpy == 1.26.4 !ピップインストールTORCH == 2.2.2 !ピップインストールtensorflow == 2.16.2 !pipインストールonnx == 1.17.0 !pipインストールonnxruntime == 1.17.0!pipインストールjax == 0.4.30 !ピップインストールjaxlib == 0.4.30 !PIPインストールOpenVino == 2024.6.0 !pipインストールmatplotlib == 3.9.3 !PIPインストールMATPLOTLIB:3.4.3 !ピップインストール枕:8.3.2 !ピップインストールPsutil:5.8.0
モデル推論は、ネットワークの重みと入力データの間でいくつかのマトリックス操作を実行することで構成されているため、モデルトレーニングやデータセットは必要ありません。この例では、ベンチマークプロセスでは、標準の分類ユースケースをシミュレートしました。これは、スパム検出やローン申請の決定(承認または拒否)などの一般的なバイナリ分類タスクをシミュレートします。これらの問題のバイナリ性は、異なるフレームワーク全体でモデルのパフォーマンスを比較するのに理想的です。このセットアップは実際のシステムを反映していますが、大きなデータセットや事前に訓練されたモデルを必要とせずに、フレームワーク全体の推論パフォーマンスに集中することができます。
サンプルタスクでは、一連の入力機能に基づいて、特定のサンプルがスパムであるかどうか(ローンの承認または拒否)であるかどうかを予測することが含まれます。このバイナリ分類の問題は計算上効率的であり、マルチクラス分類タスクの複雑さなしに推論パフォーマンスの集中的な分析を可能にします。
実際の電子メールデータをシミュレートするために、ランダムに入力を生成しました。これらの埋め込みは、スパムフィルターによって処理される可能性のあるデータのタイプを模倣しますが、外部データセットの必要性を回避します。このシミュレートされた入力データにより、特定の外部データセットに頼らずにベンチマークが可能になり、モデルの推論時間、メモリ使用量、CPUパフォーマンスのテストに最適です。または、画像分類、NLPタスク、またはその他の深い学習タスクを使用して、このベンチマークプロセスを実行することもできます。
モデルの選択は、プロファイリングプロセスから得られた推論のパフォーマンスと洞察に直接影響するため、ベンチマークの重要なステップです。前のセクションで述べたように、このベンチマーク調査では、特定のメールがスパムであるかどうかを識別する標準的な分類ユースケースを選択しました。このタスクは、計算的に効率的であるが、フレームワーク全体の比較に意味のある結果を提供する簡単な2クラスの分類問題です。
分類タスクのモデルは、バイナリ分類用に設計されたフィードフォワードニューラルネットワーク(FNN)です(スパム対スパムではない)。次のレイヤーで構成されています。
self.fc1 = torch.nn.linear(200,128)
self.fc2 = torch.nn.linear(128、64) self.fc3 = torch.nn.linear(64、32) self.fc4 = torch.nn.linear(32、16) self.fc5 = torch.nn.linear(16、8) self.fc6 = torch.nn.linear(8、1)
self.sigmoid = torch.nn.sigmoid()
モデルはシンプルですが、分類タスクに効果的です。
ユースケースでベンチマークに使用されるモデルアーキテクチャ図を以下に示します。
このワークフローは、分類タスクを使用して、複数のディープ学習フレームワーク(Tensorflow、Pytorch、OnNX、Jax、およびOpenVino)の推論パフォーマンスを比較することを目的としています。タスクには、ランダムに生成された入力データを使用し、各フレームワークをベンチマークして、予測のために取られた平均時間を測定することが含まれます。
ベンチマークのディープラーニングモデルを始めるには、まず、シームレスな統合とパフォーマンス評価を可能にする必須のPythonパッケージをインポートする必要があります。
インポート時間 OSをインポートします npとしてnumpyをインポートします トーチをインポートします tfとしてtensorflowをインポートします Tensorflow.kerasからインポート入力から onnxruntimeをortとしてインポートします pltとしてmatplotlib.pyplotをインポートします PILインポート画像から psutilをインポートします Jaxをインポートします JAX.numpyをJNPとしてインポートします OpenVino.Runtime Import Coreから CSVをインポートします
os.environ ["cuda_visible_devices"] = "-1"#disable gpu os.environ ["tf_cpp_min_log_level"] = "3" #suppress tensorflow log
このステップでは、スパム分類の入力データをランダムに生成します。
numpyを使用してランドームデータを生成して、モデルの入力機能として機能します。
#Generateダミーデータ input_data = np.random.rand(1000、200).astype(np.float32)
このステップでは、NetWrokアーキテクチャを定義するか、各深い学習フレームワーク(Tensorflow、Pytorch、ONNX、Jax、OpenVino)からモデルをセットアップします。各フレームワークには、モデルをロードして推論のために設定するための特定の方法が必要です。
クラスpytorchmodel(torch.nn.module): def __init __(self): スーパー(pytorchmodel、self).__ init __() self.fc1 = torch.nn.linear(200、128) self.fc2 = torch.nn.linear(128、64) self.fc3 = torch.nn.linear(64、32) self.fc4 = torch.nn.linear(32、16) self.fc5 = torch.nn.linear(16、8) self.fc6 = torch.nn.linear(8、1) self.sigmoid = torch.nn.sigmoid() def worward(self、x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = torch.relu(self.fc3(x)) x = torch.relu(self.fc4(x)) x = torch.relu(self.fc5(x)) x = self.sigmoid(self.fc6(x)) xを返します #Pytorchモデルを作成します pytorch_model = pytorchmodel()
tensorflow_model = tf.keras.sequential([[ 入力(shape =(200、))、 tf.keras.layers.dense(128、activation = 'lelu')、 tf.keras.layers.dense(64、activation = 'lelu')、 tf.keras.layers.dense(32、activation = 'lelu')、 tf.keras.layers.dense(16、activation = 'lelu')、 tf.keras.layers.dense(8、activation = 'lelu')、 tf.keras.layers.dense(1、activation = 'sigmoid') ])) tensorflow_model.compile()
def jax_model(x): x = jax.nn.relu(jnp.dot(x、jnp.ones(((200、128))))) x = jax.nn.relu(jnp.dot(x、jnp.ones((128、64))))) x = jax.nn.relu(jnp.dot(x、jnp.ones((64、32))))) x = jax.nn.relu(jnp.dot(x、jnp.ones((32、16))))) x = jax.nn.relu(jnp.dot(x、jnp.ones((16、8)))) x = jax.nn.sigmoid(jnp.dot(x、jnp.ones((8、1)))) xを返します
#PytorchモデルをONNXに変換します dummy_input = torch.randn(1、200) onnx_model_path = "model.onnx" torch.onnx.export( pytorch_model、 dummy_input、 onnx_model_path、 export_params = true、 opset_version = 11、 input_names = ['input']、 output_names = ['output']、 dynamic_axes = {'input':{0: 'batch_size'}、 'output':{0: 'batch_size'}} )) onnx_session = ort.inferencessession(onnx_model_path)
#OpenVinoモデルの定義 core = core() openvino_model = core.read_model(model = "model.onnx") compiled_model = core.compile_model(openvino_model、device_name = "cpu")
この関数は、predict_function、input_data、およびnum_runsの3つの引数を実行することにより、さまざまなフレームワークにわたってベンチマークテストを実行します。デフォルトでは、1,000回実行されますが、要件に応じて増やすことができます。
def benchmark_model(predict_function、input_data、num_runs = 1000): start_time = time.time() process = psutil.process(os.getpid()) cpu_usage = [] memory_usage = [] _ in range(num_runs): predict_function(input_data) cpu_usage.append(process.cpu_percent()) memory_usage.append(process.memory_info()。rss) end_time = time.time() avg_latency =(end_time -start_time) / num_runs avg_cpu = np.mean(cpu_usage) avg_memory = np.mean(memory_usage) /(1024 * 1024)#mbに変換 return avg_latency、avg_cpu、avg_memory
モデルを読み込んだので、各フレームワークのパフォーマンスをベンチマークする時が来ました。ベンチマークプロセスは、生成された入力データに推論を実行します。
#ベンチマークPytorchモデル def pytorch_predict(input_data): pytorch_model(torch.tensor(input_data)) pytorch_latency、pytorch_cpu、pytorch_memory = benchmark_model(lambda x:pytorch_predict(x)、input_data)
#ベンチマークTensorflowモデル def tensorflow_predict(input_data): tensorflow_model(input_data) tensorflow_latency、tensorflow_cpu、tensorflow_memory = benchmark_model(lambda x:tensorflow_predict(x)、input_data)
#ベンチマークJaxモデル def jax_predict(input_data): jax_model(jnp.array(input_data)) jax_latency、jax_cpu、jax_memory = benchmark_model(lambda x:jax_predict(x)、input_data)
#ベンチマークONNXモデル def onnx_predict(input_data): #バッチで入力を処理します 範囲のIの場合(input_data.shape [0]): single_input = input_data [i:i 1]#単一入力を抽出します onnx_session.run(none、{onnx_session.get_inputs()[0] .name:single_input}) onnx_latency、onnx_cpu、onnx_memory = benchmark_model(lambda x:onnx_predict(x)、input_data)
#ベンチマークOpenVinoモデル def openvino_predict(input_data): #バッチで入力を処理します 範囲のIの場合(input_data.shape [0]): single_input = input_data [i:i 1]#単一入力を抽出します compiled_model.infer_new_request({0:single_input}) OpenVino_Latency、OpenVino_CPU、OpenVino_Memory = benchmark_model(lambda x:openvino_predict(x)、input_data)
ここでは、前述のディープラーニングフレームワークのパフォーマンスベンチマークの結果について説明します。それらを比較します - レイテンシ、CPU使用、およびメモリ使用量。迅速な比較のために表のデータとプロットを含めました。
フレームワーク | レイテンシ(MS) | 相対的なレイテンシ(対pytorch) |
Pytorch | 1.26 | 1.0(ベースライン) |
Tensorflow | 6.61 | 〜5.25× |
ジャックス | 3.15 | 〜2.50× |
onnx | 14.75 | 〜11.72× |
OpenVino | 144.84 | 〜115× |
洞察:
フレームワーク | CPU使用(%) | 相対的なCPU使用 1 |
Pytorch | 99.79 | 〜1.00 |
Tensorflow | 112.26 | 〜1.13 |
ジャックス | 130.03 | 〜1.31 |
onnx | 99.58 | 〜1.00 |
OpenVino | 99.32 | 1.00(ベースライン) |
洞察:
フレームワーク | メモリ(MB) | 相対的なメモリ使用(対pytorch) |
Pytorch | 〜959.69 | 1.0(ベースライン) |
Tensorflow | 〜969.72 | 〜1.01× |
ジャックス | 〜1033.63 | 〜1.08× |
onnx | 〜1033.82 | 〜1.08× |
OpenVino | 〜1040.80 | 〜1.08–1.09× |
洞察:
ディープラーニングフレームワークのパフォーマンスを比較するプロットは次のとおりです。
この記事では、スパム分類タスクを参照として使用する顕著なディープラーニングフレームワークの推論パフォーマンス(Tensorflow、Pytorch、ONNX、JAX、およびOpenVino)を評価するための包括的なベンチマークワークフローを提示しました。レイテンシ、CPUの使用量、メモリ消費などの主要なメトリックを分析することにより、結果は、フレームワークと異なる展開シナリオに対するそれらの適合性とのトレードオフを強調しました。
Pytorchは、低遅延と効率的なメモリ使用量で優れている最もバランスのとれたパフォーマンスを実証し、リアルタイムの予測や推奨システムなどの遅延に敏感なアプリケーションに最適です。 Tensorflowは、中程度のリソース消費量を伴う中央のソリューションを提供しました。 Jaxは高い計算スループットを紹介しましたが、CPU使用率の増加を犠牲にして、これはリソースに制約のある環境の制限要因である可能性があります。一方、ONNXとOpenVinoはレイテンシに遅れをとっており、OpenVinoのパフォーマンスはハードウェアアクセラレーションがないことで特に妨げられています。
これらの調査結果は、フレームワークの選択を展開ニーズに合わせることの重要性を強調しています。速度、リソースの効率、または特定のハードウェアを最適化するかどうかにかかわらず、トレードオフを理解することは、実際の環境での効果的なモデル展開に不可欠です。
A. Pytorchの動的計算グラフと効率的な実行パイプラインにより、低遅延の推論(1.26ミリ秒)が可能になり、推奨システムやリアルタイム予測などのアプリケーションに適しています。
Q2。この研究でOpenVinoのパフォーマンスに影響を与えたものは何ですか?A. OpenVinoの最適化は、Intelハードウェア用に設計されています。この加速がなければ、そのレイテンシ(144.84ミリ秒)とメモリ使用(1040.8 MB)は、他のフレームワークと比較して競争力が低くなりました。
Q3。リソースに制約のある環境のフレームワークを選択するにはどうすればよいですか?A. CPUのみのセットアップの場合、Pytorchが最も効率的です。 Tensorflowは、中程度のワークロードの強力な選択肢です。より高いCPU使用率が許容されない限り、JAXのようなフレームワークを避けてください。
Q4。フレームワークのパフォーマンスにおいて、ハードウェアはどのような役割を果たしますか?A.フレームワークのパフォーマンスは、ハードウェアの互換性に大きく依存します。たとえば、OpenVinoはハードウェア固有の最適化を備えたIntel CPUに優れていますが、PytorchとTensorflowはさまざまなセットアップ全体で一貫して機能します。
Q5。ベンチマークの結果は、複雑なモデルやタスクで異なる可能性がありますか?A.はい、これらの結果は単純なバイナリ分類タスクを反映しています。パフォーマンスは、ResNetなどの複雑なアーキテクチャやNLPなどのタスクなどで異なる場合があり、これらのフレームワークが専門的な最適化を活用する可能性があります。
この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、著者の裁量で使用されています。
以上がディープラーニングCPUベンチマークの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。