技術共有

[AIGC] 2. Mac はローカルで GPU を使用して keras 計算を開始します

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Mac はローカルで GPU を使用して keras コンピューティングを開始します

1. 問題の背景

前回の記事から、大規模なモデルを動作させる場合、CPUを使って動作させるとCPU使用率が非常に高くなることが分かりました。したがって、ここでは、マシンに GPU グラフィックス カードがある場合、ベクトル演算でグラフィックス カードを活用して、機械学習関連の演算を迅速かつ適切に実行するにはどうすればよいかを考えます。

2. 技術的背景

機械学習をサポートする現在の主流のグラフィックス カードは、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 を使用して強化学習トレーニングを高速化します

3. 実験による検証

この操作では、従来の keras アルゴリズムでは、CPU と GPU でそれぞれ複数回の計算が実行され、統計には時間がかかります。比較統計を作成します。

ネイティブ構成

今回使用したMacマシンのソフトウェアおよびハードウェアパラメータは次のとおりです。
ここに画像の説明を挿入します

PlaidMLをインストールする

依存パッケージをインストールするプロセスにはコマンドの対話が必要なため、plaidML パッケージのインストールはコマンド ラインで実行され、コードの実行は jupyter で実行されます。

jupyterは仮想環境を利用する際にカーネルの作成が必要となる技術的な点があるため、当面はオリジナルのpython環境を直接使って検証することを推奨します。仮想環境における jupyter の構成特性を理解した学生は、仮想環境での jupyter の操作を試すことができます。

Plaidml-keras をインストールする

pip3  install plaidml-keras
  • 1

著者がコマンド pip3 install plaidml-keras を使用して plaidml-keras の最新バージョン (0.7.0) をインストールした後、初期化操作を実行するときにバグが発生しました。その後、バージョンが 0.6.4 に縮小され、実行されました。普通。しかし、0.7.0に再インストールすると、再び正常になりました。
github の plaidml

デフォルトのグラフィックス カードを構成する

コマンドラインで実行

plaidml-setup
  • 1

インタラクティブコンテンツは次のとおりです

(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]:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

現在サポートされているグラフィックス カードをリストし、デフォルトでサポートされている 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

デフォルトの選択設定では、最初に 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!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Enter を押して構成情報をデフォルト構成ファイルに書き込み、構成を完了します。

CPU コンピューティングを使用するコードを実行する

このセクションでは、jupyter を使用して単純なアルゴリズム コードを実行し、その時間を計測します。

ステップ 1 まず keras パッケージをインポートし、データ cifar10 をインポートします。これには、外部ネットワークからのダウンロードが含まれる場合があります。ご不明な点がございましたら、こちらを参照してください。keras の使用に関する基本的な質問
#!/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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

ここでのデフォルトの keral コンピューティング バックエンドは tenserflow を使用する必要があることに注意してください。出力を確認してください。

2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] この TensorFlow バイナリは、パフォーマンスが重要な操作で利用可能な CPU 命令を使用するように最適化されています。
次の手順を有効にするには: AVX2 FMA、その他の操作では、適切なコンパイラ フラグを使用して TensorFlow を再構築します。

ステップ 2 計算モデルをインポートします。モデル データがローカルに存在しない場合は、自動的にダウンロードされます。ご不明な点がございましたら、ご参照ください。keras の使用に関する基本的な質問
model = kapp.VGG19()
  • 1
step3 モデルのコンパイル
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
step4 予測を立てる
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

初期バッチの実行(タイルプログラムのコンパイル)
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1秒 1秒/ステップ

step5 10個の予測を立てる
# 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
  • 2
  • 3
  • 4
  • 5

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秒で実行されました

GPU コンピューティングを使用してコードを実行する

グラフィックス カード metal_intel®_uhd_graphics_630.0 の使用

step0 plaidml を通じて keras をインポートし、keras 関連の操作を実行します。
# 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
  • 2
  • 3
  • 4
  • 5

注記:
1.plaidml=0.7.0バージョンを使用すると、plaidml.keras.install_backend()の処理でエラーが発生します。
2. このステップでは、keras は plaidml を通じてインポートされ、バックグラウンド コンピューティング エンジンは Tenserflow ではなく plaidml に設定されます。

step1 まずkerasパッケージをインポートし、データcifar10をインポートします
#!/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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
step2 計算モデルをインポートします。モデルデータがローカルに存在しない場合は、自動的にダウンロードされます。
model = kapp.VGG19()
  • 1

初回実行時にグラフィックス カード情報を出力する

INFO:plaidml:デバイス「metal_intel®_uhd_graphics_630.0」を開いています

step3 モデルのコンパイル
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
step4 予測を立てる
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

初期バッチの実行(タイルプログラムのコンパイル)

出力が高速なため、コンテンツは 1 行だけ印刷されます。

step5 10個の予測を立てる
# 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
  • 2
  • 3
  • 4
  • 5

4.241918087005615秒で実行されました
8.452141046524048秒で実行されました
12.665411949157715秒で実行されました
16.849968910217285秒で実行されました
21.025720834732056秒で実行されました
25.212764024734497秒で実行されました
29.405478954315186秒で実行されました
33.594977140426636秒で実行されました
37.7886438369751秒で実行されました
41.98136305809021秒で実行されました

グラフィックス カード metal_amd_radeon_pro_5300m.0 の使用

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!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
step0 plaidml を通じて keras をインポートし、keras 関連の操作を実行します。
# 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
  • 2
  • 3
  • 4
  • 5

注記:
1.plaidml=0.7.0バージョンを使用すると、plaidml.keras.install_backend()の処理でエラーが発生します。
2. このステップでは、keras は plaidml を通じてインポートされ、バックグラウンド コンピューティング エンジンは Tenserflow ではなく plaidml に設定されます。

step1 まずkerasパッケージをインポートし、データcifar10をインポートします
#!/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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
step2 計算モデルをインポートします。モデルデータがローカルに存在しない場合は、自動的にダウンロードされます。
model = kapp.VGG19()
  • 1

INFO:plaidml:デバイス「metal_amd_radeon_pro_5300m.0」を開いています
グラフィックス カード情報がここで初めて入力されることに注意してください。

step3 モデルのコンパイル
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
step4 予測を立てる
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

初期バッチの実行(タイルプログラムのコンパイル)

出力が高速なため、コンテンツは 1 行だけ印刷されます。

step5 10個の予測を立てる
# 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
  • 2
  • 3
  • 4
  • 5

出力を表示する

0.43606019020080566秒で実行されました
0.8583459854125977秒で実行されました
1.2787911891937256秒で実行されました
1.70143723487854秒で実行されました
2.1235032081604004秒で実行されました
2.5464580059051514秒で実行されました
2.9677979946136475秒で実行されました
3.390064001083374秒で実行されました
3.8117799758911133秒で実行されました
4.236911058425903秒で実行されました

4. 評価に関する議論

グラフィックス カード metal_intel®_uhd_graphics_630.0 のメモリ値は 1536 MB ですが、グラフィックス カードとしての計算パフォーマンスはこのマシンの 6 コア CPU には及びません。
グラフィックス カード metal_amd_radeon_pro_5300m.0 のメモリ値は 4G で、ネイティブ CPU と比較してパフォーマンスが 1 倍近く高くなります。

このことから、機械学習操作で GPU を使用することの強力な利点がわかります。