Berbagi teknologi

[AIGC] 2. Mac secara lokal menggunakan GPU untuk memulai penghitungan keras

2024-07-12

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

Mac secara lokal menggunakan GPU untuk memulai komputasi keras

1. Latar belakang masalah

Dari artikel sebelumnya, kita telah menemukan bahwa dalam pengoperasian model besar, ketika menggunakan CPU untuk pengoperasiannya, penggunaan CPU sangat tinggi. Oleh karena itu, di sini kita akan berpikir bahwa jika terdapat kartu grafis GPU di dalam mesin, bagaimana kita dapat memanfaatkan kartu grafis tersebut dalam operasi vektor dan melakukan operasi terkait pembelajaran mesin dengan cepat dan baik.

2. Latar belakang teknis

Kita tahu bahwa kartu grafis mainstream saat ini yang mendukung pembelajaran mesin adalah kartu grafis seri Nvida, yang biasa disebut kartu N. Namun, pada mesin Mac, kartu grafis seri AMD biasanya terintegrasi. Perbedaan antara dua set instruksi perangkat keras yang berbeda menyebabkan perlunya teknologi implementasi yang berbeda di lapisan atas.
Namun pada kartu grafis AMD terdapat teknologi PlaidML, melalui plug-in ini perbedaan kartu grafis yang berbeda dapat diringkas.

Alamat proyek PlaidML: https://github.com/plaidml/plaidml
Saat ini, PlaidML sudah mendukung alat seperti Keras, ONNX, dan nGraph. Anda dapat langsung menggunakan Keras untuk membuat model, dan MacBook Anda dapat dengan mudah memanggil GPU.
Melalui alat yang disebut PlaidML ini, pelatihan pembelajaran mendalam dapat dilakukan dengan mudah terlepas dari kartu grafis NVIDIA, AMD, atau Intel.

mengacu pada:Mac mempercepat pelatihan pembelajaran penguatan dengan PlaidML

3. Verifikasi eksperimental

Dalam operasi ini, untuk algoritme keras konvensional, beberapa putaran penghitungan dilakukan pada CPU dan GPU, dan statistiknya memakan waktu. Buatlah statistik perbandingan.

Konfigurasi asli

Parameter software dan hardware mesin mac yang digunakan kali ini adalah sebagai berikut:
Masukkan deskripsi gambar di sini

Instal PlaidML

Karena proses instalasi paket dependen memerlukan interaksi perintah, instalasi paket plaidML dilakukan pada baris perintah, dan eksekusi kode dilakukan di jupyter.

Karena jupyter akan memiliki poin teknis yang memerlukan pembuatan kernel saat menggunakan lingkungan virtual, disarankan untuk langsung menggunakan lingkungan python asli untuk verifikasi untuk saat ini. Siswa yang memahami karakteristik konfigurasi jupyter di lingkungan virtual dapat mencoba mengoperasikannya di lingkungan virtual.

Instal plaidml-keras

pip3  install plaidml-keras
  • 1

Setelah penulis menggunakan perintah pip3 install plaidml-keras untuk menginstal plaidml-keras versi terbaru yaitu 0.7.0, saya menemukan bug saat melakukan operasi inisialisasi normal. Tapi kemudian saya instal lagi sebagai 0.7.0 dan normal kembali.
plaidml di github

Konfigurasikan kartu grafis default

Jalankan pada baris perintah

plaidml-setup
  • 1

Konten interaktifnya adalah sebagai berikut

(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

Buat daftar kartu grafis yang didukung saat ini dan pilih antara 2 kartu grafis yang didukung secara default atau keenam perangkat keras yang didukung dalam tahap percobaan.
Anda dapat melihat dua kartu grafis yang didukung secara default, yang merupakan dua kartu grafis sebenarnya di tangkapan layar awal. Demi stabilitas pengujian, pilih N terlebih dahulu dan tekan 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

Untuk pengaturan default yang dipilih, atur perangkat default. Di sini kita atur dulu metal_intel®_uhd_graphics_630.0 sebagai perangkat default. Tentu saja, kinerja perangkat ini sebenarnya relatif buruk. Nanti kita akan menetapkan metal_amd_radeon_pro_5300m.0 sebagai perangkat default perbandingan.
Setelah menulis 1, tekan 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

Tekan Enter untuk menulis informasi konfigurasi ke dalam file konfigurasi default untuk menyelesaikan konfigurasi.

Jalankan kode yang menggunakan komputasi CPU

Pada bagian ini, jupyter digunakan untuk menjalankan kode algoritma sederhana dan waktunya dihitung.

Langkah 1 Pertama impor paket keras dan impor data cifar10. Ini mungkin melibatkan pengunduhan dari jaringan eksternal.Pertanyaan dasar tentang penggunaan 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

Perhatikan bahwa backend komputasi keral default di sini harus menggunakan tenserflow, periksa hasilnya

2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] Biner TensorFlow ini dioptimalkan untuk menggunakan instruksi CPU yang tersedia dalam operasi yang kritis terhadap kinerja.
Untuk mengaktifkan petunjuk berikut: AVX2 FMA, dalam operasi lain, bangun kembali TensorFlow dengan tanda kompiler yang sesuai.

Langkah 2 Impor model perhitungan. Jika data model tidak ada secara lokal, maka akan diunduh secara otomatis.Pertanyaan dasar tentang penggunaan keras
model = kapp.VGG19()
  • 1
kompilasi model langkah3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
langkah 4 Buat prediksi
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Menjalankan batch awal (mengkompilasi program tile)
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1s 1s/langkah

langkah5 Buat 10 prediksi
# 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 ━━━━━━━━━━━━━━━━━━━━ 1d 891md/langkah
Berlari dalam 0,9295139312744141 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1d 923ms/langkah
Berlari dalam waktu 1.8894760608673096 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1d 893md/langkah
Berlari dalam waktu 2,818492889404297 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 932ms/langkah
Berlari dalam waktu 3.7831668853759766 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 892ms/langkah
Berlari dalam waktu 4,71358585357666 detik
1/1 ━━━━━━━━━━━━━━━━━━━━━ 1s 860ms/langkah
Berlari dalam waktu 5.609835863113403 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 878ms/langkah
Berlari dalam waktu 6.5182459354400635 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1d 871md/langkah
Berlari dalam waktu 7.423128128051758 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 896ms/langkah
Berlari dalam waktu 8.352543830871582 detik
1/1 ━━━━━━━━━━━━━━━━━━━━ 1d 902md/langkah
Berlari dalam waktu 9.288795948028564 detik

Jalankan kode menggunakan komputasi GPU

Menggunakan kartu grafis metal_intel®_uhd_graphics_630.0

step0 Impor keras melalui plaidml, lalu lakukan operasi terkait 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

Catatan:
1. Ketika versi plaidml=0.7.0 digunakan, kesalahan akan terjadi pada operasi plaidml.keras.install_backend().
2. Pada langkah ini, keras akan diimpor melalui plaidml, dan mesin komputasi latar belakang akan disetel ke plaidml, bukan tenserflow.

langkah 1 Pertama impor paket keras dan impor data 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
langkah 2 Impor model perhitungan. Jika data model tidak ada secara lokal, maka akan diunduh secara otomatis.
model = kapp.VGG19()
  • 1

Keluarkan informasi kartu grafis saat pertama kali dijalankan

INFO:plaidml:Perangkat pembuka “metal_intel®_uhd_graphics_630.0”

kompilasi model langkah3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
langkah 4 Buat prediksi
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Menjalankan batch awal (mengkompilasi program tile)

Karena outputnya lebih cepat, hanya satu baris konten yang dicetak.

langkah5 Buat 10 prediksi
# 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

Berlari dalam waktu 4.241918087005615 detik
Berlari dalam waktu 8.452141046524048 detik
Berlari dalam waktu 12.665411949157715 detik
Berlari dalam waktu 16.849968910217285 detik
Berlari dalam waktu 21.025720834732056 detik
Berlari dalam waktu 25.212764024734497 detik
Berlari dalam waktu 29.405478954315186 detik
Berlari dalam waktu 33.594977140426636 detik
Berlari dalam waktu 37.7886438369751 detik
Berlari dalam waktu 41.98136305809021 detik

Menggunakan kartu grafis metal_amd_radeon_pro_5300m.0

Pada tahap pemilihan kartu grafis pada setting plaidml-setup, kartu grafis metal_intel®_uhd_graphics_630.0 tidak dipilih lagi, melainkan metal_amd_radeon_pro_5300m.0 yang dipilih.

(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 Impor keras melalui plaidml, lalu lakukan operasi terkait 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

Catatan:
1. Ketika versi plaidml=0.7.0 digunakan, kesalahan akan terjadi pada operasi plaidml.keras.install_backend().
2. Pada langkah ini, keras akan diimpor melalui plaidml, dan mesin komputasi latar belakang akan disetel ke plaidml, bukan tenserflow.

langkah 1 Pertama impor paket keras dan impor data 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
langkah 2 Impor model perhitungan. Jika data model tidak ada secara lokal, maka akan diunduh secara otomatis.
model = kapp.VGG19()
  • 1

INFO:plaidml:Membuka perangkat “metal_amd_radeon_pro_5300m.0”
Perhatikan bahwa informasi kartu grafis dimasukkan di sini untuk pertama kalinya.

kompilasi model langkah3
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
langkah 4 Buat prediksi
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Menjalankan batch awal (mengkompilasi program tile)

Karena outputnya lebih cepat, hanya satu baris konten yang dicetak.

langkah5 Buat 10 prediksi
# 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

Lihat keluaran

Berjalan dalam waktu 0,43606019020080566 detik
Berjalan dalam 0,8583459854125977 detik
Berlari dalam waktu 1.2787911891937256 detik
Berlari dalam waktu 1.70143723487854 detik
Berlari dalam waktu 2.1235032081604004 detik
Berlari dalam waktu 2,5464580059051514 detik
Berlari dalam waktu 2.9677979946136475 detik
Berlari dalam waktu 3.390064001083374 detik
Berlari dalam waktu 3.8117799758911133 detik
Berlari dalam waktu 4.236911058425903 detik

4. Diskusi Evaluasi

Nilai memori kartu grafis metal_intel®_uhd_graphics_630.0 adalah 1536 MB. Meski sebagai kartu grafis, performanya dalam perhitungan tidak sebaik CPU 6-core mesin ini;
Kartu grafis metal_amd_radeon_pro_5300m.0 memiliki nilai memori 4G. Dibandingkan dengan CPU asli, kinerjanya hampir 1 kali lebih tinggi.

Dari sini kita dapat melihat keuntungan besar menggunakan GPU dalam operasi pembelajaran mesin.