私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
前回の記事から、大規模なモデルを動作させる場合、CPUを使って動作させるとCPU使用率が非常に高くなることが分かりました。したがって、ここでは、マシンに GPU グラフィックス カードがある場合、ベクトル演算でグラフィックス カードを活用して、機械学習関連の演算を迅速かつ適切に実行するにはどうすればよいかを考えます。
機械学習をサポートする現在の主流のグラフィックス カードは、Nvida シリーズのグラフィックス カード (通称 N カード) であることはわかっていますが、Mac マシンでは通常、AMD シリーズのグラフィックス カードが統合されています。 2 つの異なるハードウェア命令セットの違いにより、上位層で異なる実装テクノロジが必要になります。
ただし、AMD グラフィックス カードには PlaidML テクノロジーがあり、このプラグインを通じて、さまざまなグラフィックス カード間の差異をカプセル化できます。
PlaidML プロジェクトのアドレス: https://github.com/plaidml/plaidml
現在、PlaidML はすでに Keras、ONNX、nGraph などのツールをサポートしています。Keras を直接使用してモデルを構築でき、MacBook から簡単に GPU を呼び出すことができます。
PlaidML と呼ばれるこのツールを使用すると、NVIDIA、AMD、Intel グラフィックス カードに関係なく、ディープ ラーニング トレーニングを簡単に実行できます。
参照する:Mac は PlaidML を使用して強化学習トレーニングを高速化します
この操作では、従来の keras アルゴリズムでは、CPU と GPU でそれぞれ複数回の計算が実行され、統計には時間がかかります。比較統計を作成します。
今回使用したMacマシンのソフトウェアおよびハードウェアパラメータは次のとおりです。
依存パッケージをインストールするプロセスにはコマンドの対話が必要なため、plaidML パッケージのインストールはコマンド ラインで実行され、コードの実行は jupyter で実行されます。
jupyterは仮想環境を利用する際にカーネルの作成が必要となる技術的な点があるため、当面はオリジナルのpython環境を直接使って検証することを推奨します。仮想環境における jupyter の構成特性を理解した学生は、仮想環境での jupyter の操作を試すことができます。
pip3 install plaidml-keras
著者がコマンド pip3 install plaidml-keras を使用して plaidml-keras の最新バージョン (0.7.0) をインストールした後、初期化操作を実行するときにバグが発生しました。その後、バージョンが 0.6.4 に縮小され、実行されました。普通。しかし、0.7.0に再インストールすると、再び正常になりました。
github の plaidml
コマンドラインで実行
plaidml-setup
インタラクティブコンテンツは次のとおりです
(venv) tsingj@tsingjdeMacBook-Pro-2 ~ # plaidml-setup
PlaidML Setup (0.6.4)
Thanks for using PlaidML!
Some Notes:
* Bugs and other issues: https://github.com/plaidml/plaidml
* Questions: https://stackoverflow.com/questions/tagged/plaidml
* Say hello: https://groups.google.com/forum/#!forum/plaidml-dev
* PlaidML is licensed under the Apache License 2.0
Default Config Devices:
metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)
Experimental Config Devices:
llvm_cpu.0 : CPU (LLVM)
metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
opencl_amd_radeon_pro_5300m_compute_engine.0 : AMD AMD Radeon Pro 5300M Compute Engine (OpenCL)
opencl_cpu.0 : Intel CPU (OpenCL)
opencl_intel_uhd_graphics_630.0 : Intel Inc. Intel(R) UHD Graphics 630 (OpenCL)
metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)
Using experimental devices can cause poor performance, crashes, and other nastiness.
Enable experimental device support? (y,n)[n]:
現在サポートされているグラフィックス カードをリストし、デフォルトでサポートされている 2 つのグラフィックス カード、または実験段階でサポートされている 6 つのハードウェアすべてから選択します。
デフォルトでサポートされている 2 つのグラフィックス カードが確認できます。これは、最初のスクリーンショットにある 2 つの実際のグラフィックス カードです。テストの安定性を高めるために、最初に N を選択して Enter を押します。
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:
1 : metal_intel(r)_uhd_graphics_630.0
2 : metal_amd_radeon_pro_5300m.0
Default device? (1,2)[1]:1
Selected device:
metal_intel(r)_uhd_graphics_630.0
デフォルトの選択設定では、最初に metal_intel®_uhd_graphics_630.0 をデフォルトのデバイスとして設定します。もちろん、このデバイスのパフォーマンスは実際には比較的低いですが、後で metal_amd_radeon_pro_5300m.0 をデフォルトのデバイスとして設定します。比較。
1を書き込んだ後、Enterを押します。
Almost done. Multiplying some matrices...
Tile code:
function (B[X,Z], C[Z,Y]) -> (A) { A[x,y : X,Y] = +(B[x,z] * C[z,y]); }
Whew. That worked.
Save settings to /Users/tsingj/.plaidml? (y,n)[y]:y
Success!
Enter を押して構成情報をデフォルト構成ファイルに書き込み、構成を完了します。
このセクションでは、jupyter を使用して単純なアルゴリズム コードを実行し、その時間を計測します。
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
ここでのデフォルトの keral コンピューティング バックエンドは tenserflow を使用する必要があることに注意してください。出力を確認してください。
2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] この TensorFlow バイナリは、パフォーマンスが重要な操作で利用可能な CPU 命令を使用するように最適化されています。
次の手順を有効にするには: AVX2 FMA、その他の操作では、適切なコンパイラ フラグを使用して TensorFlow を再構築します。
model = kapp.VGG19()
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
初期バッチの実行(タイルプログラムのコンパイル)
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 1秒/ステップ
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
y = model.predict(x=x_train, batch_size=batch_size)
print("Ran in {} seconds".format(time.time() - start))
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 891ミリ秒/ステップ
0.9295139312744141秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 923ミリ秒/ステップ
1.8894760608673096秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 893ミリ秒/ステップ
2.818492889404297秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 932ミリ秒/ステップ
3.7831668853759766秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 892ミリ秒/ステップ
4.71358585357666秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 860ミリ秒/ステップ
5.609835863113403秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 878ミリ秒/ステップ
6.5182459354400635秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 871ミリ秒/ステップ
7.423128128051758秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 896ミリ秒/ステップ
8.352543830871582秒で実行されました
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 902ミリ秒/ステップ
9.288795948028564秒で実行されました
# Importing PlaidML. Make sure you follow this order
import plaidml.keras
plaidml.keras.install_backend()
import os
os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
注記:
1.plaidml=0.7.0バージョンを使用すると、plaidml.keras.install_backend()の処理でエラーが発生します。
2. このステップでは、keras は plaidml を通じてインポートされ、バックグラウンド コンピューティング エンジンは Tenserflow ではなく plaidml に設定されます。
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
model = kapp.VGG19()
初回実行時にグラフィックス カード情報を出力する
INFO:plaidml:デバイス「metal_intel®_uhd_graphics_630.0」を開いています
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
初期バッチの実行(タイルプログラムのコンパイル)
出力が高速なため、コンテンツは 1 行だけ印刷されます。
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
y = model.predict(x=x_train, batch_size=batch_size)
print("Ran in {} seconds".format(time.time() - start))
4.241918087005615秒で実行されました
8.452141046524048秒で実行されました
12.665411949157715秒で実行されました
16.849968910217285秒で実行されました
21.025720834732056秒で実行されました
25.212764024734497秒で実行されました
29.405478954315186秒で実行されました
33.594977140426636秒で実行されました
37.7886438369751秒で実行されました
41.98136305809021秒で実行されました
plaidml-setup 設定でグラフィックス カードを選択する段階で、グラフィックス カード metal_intel®_uhd_graphics_630.0 が選択されなくなり、metal_amd_radeon_pro_5300m.0 が選択されます。
(venv) tsingj@tsingjdeMacBook-Pro-2 ~ # plaidml-setup
PlaidML Setup (0.6.4)
Thanks for using PlaidML!
Some Notes:
* Bugs and other issues: https://github.com/plaidml/plaidml
* Questions: https://stackoverflow.com/questions/tagged/plaidml
* Say hello: https://groups.google.com/forum/#!forum/plaidml-dev
* PlaidML is licensed under the Apache License 2.0
Default Config Devices:
metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)
Experimental Config Devices:
llvm_cpu.0 : CPU (LLVM)
metal_intel(r)_uhd_graphics_630.0 : Intel(R) UHD Graphics 630 (Metal)
opencl_amd_radeon_pro_5300m_compute_engine.0 : AMD AMD Radeon Pro 5300M Compute Engine (OpenCL)
opencl_cpu.0 : Intel CPU (OpenCL)
opencl_intel_uhd_graphics_630.0 : Intel Inc. Intel(R) UHD Graphics 630 (OpenCL)
metal_amd_radeon_pro_5300m.0 : AMD Radeon Pro 5300M (Metal)
Using experimental devices can cause poor performance, crashes, and other nastiness.
Enable experimental device support? (y,n)[n]:n
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:
1 : metal_intel(r)_uhd_graphics_630.0
2 : metal_amd_radeon_pro_5300m.0
Default device? (1,2)[1]:2
Selected device:
metal_amd_radeon_pro_5300m.0
Almost done. Multiplying some matrices...
Tile code:
function (B[X,Z], C[Z,Y]) -> (A) { A[x,y : X,Y] = +(B[x,z] * C[z,y]); }
Whew. That worked.
Save settings to /Users/tsingj/.plaidml? (y,n)[y]:y
Success!
# Importing PlaidML. Make sure you follow this order
import plaidml.keras
plaidml.keras.install_backend()
import os
os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"
注記:
1.plaidml=0.7.0バージョンを使用すると、plaidml.keras.install_backend()の処理でエラーが発生します。
2. このステップでは、keras は plaidml を通じてインポートされ、バックグラウンド コンピューティング エンジンは Tenserflow ではなく plaidml に設定されます。
#!/usr/bin/env python
import numpy as np
import os
import time
import keras
import keras.applications as kapp
from keras.datasets import cifar10
(x_train, y_train_cats), (x_test, y_test_cats) = cifar10.load_data()
batch_size = 8
x_train = x_train[:batch_size]
x_train = np.repeat(np.repeat(x_train, 7, axis=1), 7, axis=2)
model = kapp.VGG19()
INFO:plaidml:デバイス「metal_amd_radeon_pro_5300m.0」を開いています
グラフィックス カード情報がここで初めて入力されることに注意してください。
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
初期バッチの実行(タイルプログラムのコンパイル)
出力が高速なため、コンテンツは 1 行だけ印刷されます。
# Now start the clock and run 10 batchesprint("Timing inference...")
start = time.time()
for i in range(10):
y = model.predict(x=x_train, batch_size=batch_size)
print("Ran in {} seconds".format(time.time() - start))
出力を表示する
0.43606019020080566秒で実行されました
0.8583459854125977秒で実行されました
1.2787911891937256秒で実行されました
1.70143723487854秒で実行されました
2.1235032081604004秒で実行されました
2.5464580059051514秒で実行されました
2.9677979946136475秒で実行されました
3.390064001083374秒で実行されました
3.8117799758911133秒で実行されました
4.236911058425903秒で実行されました
グラフィックス カード metal_intel®_uhd_graphics_630.0 のメモリ値は 1536 MB ですが、グラフィックス カードとしての計算パフォーマンスはこのマシンの 6 コア CPU には及びません。
グラフィックス カード metal_amd_radeon_pro_5300m.0 のメモリ値は 4G で、ネイティブ CPU と比較してパフォーマンスが 1 倍近く高くなります。
このことから、機械学習操作で GPU を使用することの強力な利点がわかります。