Teknologian jakaminen

[AIGC] 2. Mac käyttää paikallisesti GPU:ta keras-laskelmien käynnistämiseen

2024-07-12

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

1. Ongelman tausta

Edellisestä artikkelista olemme havainneet, että suurten mallien toiminnassa CPU:ta käytettäessä prosessorin käyttö on erittäin korkeaa. Siksi pohditaan tässä, että jos koneessa on GPU-näytönohjain, kuinka voimme hyödyntää näytönohjainta vektorioperaatioissa ja suorittaa koneoppimiseen liittyvät toiminnot nopeasti ja hyvin.

2. Tekninen tausta

Tiedämme, että nykyiset koneoppimista tukevat valtavirran näytönohjaimet ovat Nvida-sarjan näytönohjaimia, jotka tunnetaan yleisesti nimellä N-kortit. Mac-koneissa AMD-sarjan näytönohjaimet ovat kuitenkin yleensä integroituja. Kahden erilaisen laitteistokäskyjoukon välinen ero johtaa siihen, että ylemmässä kerroksessa tarvitaan erilaisia ​​toteutustekniikoita.
Mutta AMD-näytönohjainkorteissa on PlaidML-tekniikka, jonka kautta eri näytönohjainkorttien erot voidaan kapseloida tämän laajennuksen avulla.

PlaidML-projektin osoite: https://github.com/plaidml/plaidml
Tällä hetkellä PlaidML tukee jo työkaluja, kuten Keras, ONNX ja nGraph. Voit käyttää Kerasta suoraan mallin rakentamiseen, ja MacBookisi voi helposti kutsua GPU:ta.
Tämän PlaidML-nimisen työkalun avulla voit suorittaa syvän oppimisen harjoittelun helposti riippumatta NVIDIA-, AMD- tai Intel-näytönohjainkorteista.

viitata:Mac käyttää PlaidML:ää nopeuttamaan vahvistusoppimiskoulutusta

3. Kokeellinen todentaminen

Tässä toiminnossa tavanomaiselle keras-algoritmille suoritetaan useita laskutoimituksia CPU:lle ja GPU:lle, vastaavasti, ja tilastot ovat aikaa vieviä. Tee vertailevia tilastoja.

Alkuperäinen kokoonpano

Tällä kertaa käytetyn mac-koneen ohjelmisto- ja laitteistoparametrit ovat seuraavat:
Lisää kuvan kuvaus tähän

Asenna PlaidML

Koska riippuvien pakettien asennusprosessi vaatii komentovuorovaikutusta, plaidML-paketin asennus suoritetaan komentorivillä ja koodin suoritus suoritetaan jupyterissä.

Koska jupyterissa on teknisiä kohtia, jotka edellyttävät ytimen luomista virtuaaliympäristöä käytettäessä, on suositeltavaa käyttää toistaiseksi suoraan alkuperäistä python-ympäristöä varmentamiseen. Opiskelijat, jotka ymmärtävät jupyterin konfigurointiominaisuudet virtuaaliympäristössä, voivat yrittää käyttää sitä virtuaaliympäristössä.

Asenna plaidml-keras

pip3  install plaidml-keras
  • 1

Kun kirjoittaja käytti komennolla pip3 install plaidml-keras asentaakseen plaidml-kerasin uusimman version, joka on 0.7.0, törmäsin virheeseen alustusoperaatiota tehdessäni normaali. Mutta kun se oli asennettu uudelleen 0.7.0:aan, se oli taas normaali.
plaidml githubissa

Määritä oletusnäytönohjain

Suorita komentorivillä

plaidml-setup
  • 1

Interaktiivinen sisältö on seuraava

(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

Luettele tällä hetkellä tuetut näytönohjaimet ja valitse joko 2 tuetun näytönohjaimen välillä tai kaikki 6 tuettua laitteistoa koevaiheessa.
Näet kaksi oletusarvoisesti tuettua näytönohjainta, jotka ovat alkuperäisen kuvakaappauksen kaksi todellista näytönohjainta. Testin vakauden vuoksi valitse ensin N ja paina 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

Oletusasetuksille asetamme oletuslaitteeksi metal_intel®_uhd_graphics_630.0. Tämän laitteen suorituskyky on itse asiassa suhteellisen heikko. Myöhemmin asetamme oletuslaitteeksi vertailu.
Kun olet kirjoittanut 1, paina 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

Paina Enter kirjoittaaksesi määritystiedot oletusasetustiedostoon konfiguroinnin viimeistelemiseksi.

Suorita CPU-laskentaa käyttävä koodi

Tässä osiossa jupyteriä käytetään yksinkertaisen algoritmikoodin suorittamiseen ja sen aika lasketaan.

Vaihe 1 Tuo ensin keras-paketti ja tuo tiedot cifar10. Jos sinulla on kysyttävää, katso se.Peruskysymyksiä keran käytöstä
#!/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

Huomaa, että tämän oletuskeral-laskentataustaohjelman tulisi käyttää tenserflow:ta, tarkista tulos

2024-07-11 14:36:02.753107: I tensorflow/core/platform/cpu_feature_guard.cc:210] Tämä TensorFlow-binaari on optimoitu käyttämään käytettävissä olevia suorittimen ohjeita suorituskykykriittisissä operaatioissa.
Ota seuraavat ohjeet käyttöön: AVX2 FMA muissa toiminnoissa rakentaa TensorFlow uudelleen asianmukaisilla kääntäjälippuilla.

Vaihe 2 Tuo laskentamalli Jos mallitietoja ei ole olemassa, se ladataan automaattisesti. Jos sinulla on kysyttävää, katso se.Peruskysymyksiä keran käytöstä
model = kapp.VGG19()
  • 1
vaiheen 3 mallin kokoaminen
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
vaihe 4 Tee ennuste
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Alkuerän suorittaminen (laattaohjelman käännös)
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 1s/askel

vaihe 5 Tee 10 ennustetta
# 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 s 891 ms/askel
Juoksui 0,9295139312744141 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 923 ms/askel
Juoksu 1,8894760608673096 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 893 ms/askel
Juoksu 2,818492889404297 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 932 ms/askel
Juoksui 3,7831668853759766 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 892 ms/askel
Juoksui 4,71358585357666 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 860 ms/askel
Juoksu 5,609835863113403 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 878 ms/askel
Juoksu 6,5182459354400635 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 871 ms/askel
Juoksu 7,423128128051758 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1 s 896 ms/askel
Juoksui 8,352543830871582 sekunnissa
1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 902ms/askel
Juoksui 9,288795948028564 sekunnissa

Suorita koodi GPU-laskennan avulla

Näytönohjaimen käyttö metal_intel®_uhd_graphics_630.0

step0 Tuo keras plaidml:n kautta ja tee sitten keraan liittyviä toimintoja
# 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

Huomautus:
1. Kun plaidml=0.7.0-versiota käytetään, plaidml.keras.install_backend() -operaatiossa tapahtuu virhe.
2. Tässä vaiheessa keras tuodaan plaidml:n kautta ja taustalaskentamoottoriksi asetetaan plaidml tenserflown sijaan.

vaihe1 Tuo ensin keras-paketti ja tuo tiedot 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
vaihe 2 Tuo laskentamalli Jos mallitietoja ei ole olemassa paikallisesti, se ladataan automaattisesti.
model = kapp.VGG19()
  • 1

Tulosta näytönohjaimen tiedot ensimmäisellä kerralla

INFO:plaidml: Avauslaite "metal_intel®_uhd_graphics_630.0"

vaiheen 3 mallin kokoaminen
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
vaihe 4 Tee ennuste
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Alkuerän suorittaminen (laattaohjelman käännös)

Koska tuloste on nopeampi, vain yksi sisältörivi tulostetaan.

vaihe 5 Tee 10 ennustetta
# 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

Juoksu 4,241918087005615 sekunnissa
Juoksu 8,452141046524048 sekunnissa
Juoksu 12,665411949157715 sekunnissa
Juoksui 16,849968910217285 sekunnissa
Juoksu 21,025720834732056 sekunnissa
Juoksu 25,212764024734497 sekunnissa
Juoksu 29,405478954315186 sekunnissa
Juoksu 33,594977140426636 sekunnissa
Juoksu 37,7886438369751 sekunnissa
Juoksu 41,98136305809021 sekunnissa

Näytönohjaimen käyttö metal_amd_radeon_pro_5300m.0

Näytönohjaimen valintavaiheessa plaidml-setup-asetuksissa näytönohjainta metal_intel®_uhd_graphics_630.0 ei enää valita, mutta valittuna on 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 Tuo keras plaidml:n kautta ja tee sitten keraan liittyviä toimintoja
# 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

Huomautus:
1. Kun plaidml=0.7.0-versiota käytetään, plaidml.keras.install_backend() -operaatiossa tapahtuu virhe.
2. Tässä vaiheessa keras tuodaan plaidml:n kautta ja taustalaskentamoottoriksi asetetaan plaidml tenserflown sijaan.

vaihe1 Tuo ensin keras-paketti ja tuo tiedot 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
vaihe 2 Tuo laskentamalli Jos mallitietoja ei ole olemassa paikallisesti, se ladataan automaattisesti.
model = kapp.VGG19()
  • 1

INFO:plaidml: Avauslaite "metal_amd_radeon_pro_5300m.0"
Huomaa, että näytönohjaimen tiedot syötetään tähän ensimmäistä kertaa.

vaiheen 3 mallin kokoaminen
model.compile(optimizer='sgd', loss='categorical_crossentropy',metrics=['accuracy'])
  • 1
vaihe 4 Tee ennuste
print("Running initial batch (compiling tile program)")
y = model.predict(x=x_train, batch_size=batch_size)
  • 1
  • 2

Alkuerän suorittaminen (laattaohjelman käännös)

Koska tuloste on nopeampi, vain yksi sisältörivi tulostetaan.

vaihe 5 Tee 10 ennustetta
# 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

Näytä tulos

Juoksu 0,43606019020080566 sekunnissa
Juoksui 0,8583459854125977 sekunnissa
Juoksui 1,2787911891937256 sekunnissa
Juoksui 1,70143723487854 sekunnissa
Juoksu 2,1235032081604004 sekunnissa
Juoksu 2,5464580059051514 sekunnissa
Juoksu 2,9677979946136475 sekunnissa
Juoksu 3,390064001083374 sekunnissa
Juoksui 3,8117799758911133 sekunnissa
Juoksu 4,236911058425903 sekunnissa

4. Arviointikeskustelu

Grafiikkakortin metal_intel®_uhd_graphics_630.0 muistiarvo on 1536 Mt. Vaikka näytönohjain onkin, sen suorituskyky laskelmissa ei ole yhtä hyvä kuin tämän koneen 6-ytiminen prosessori.
Näytönohjaimen metal_amd_radeon_pro_5300m.0 muistiarvo on 4G Verrattuna alkuperäiseen prosessoriin, sen suorituskyky on lähes 1 kertaa suurempi.

Tästä voimme nähdä GPU:n käytön tehokkaat edut koneoppimistoiminnassa.