Hasonlítsa össze az Apple Silicon M1 CPU és GPU teljesítményét az MLP, CNN és ​​LSTM modellek csúcskategóriás konfigurációival

Novemberi bevezetésük óta az Apple Silicon M1 Mac-ek számos benchmarkban lenyűgöző teljesítményt mutatnak. Ezek az új processzorok olyan gyorsak, hogy sok teszt a MacBook Airt vagy a Pro-t csúcskategóriás asztali számítógépekkel hasonlítja össze, ahelyett, hogy a laptoppalettán maradna. Ennek általában nincs értelme a benchmarkban. De itt a dolgok másként működnek, mivel az M1 az energiafogyasztásuk töredékéért gyorsabb, mint a legtöbb.

Az Apple a TensorFlow „Apple Silicon natív verzióján” dolgozik, amely képes kihasználni az M1-ben rejlő lehetőségeket. November 18-án a Google közzétett egy „benchmark”-ot, amely a TensorFlow korábbi verzióihoz képest a teljesítmény növekedését mutatja Mac számítógépeken.

Ennek következtében a gépi tanulási mérnökök most nagyon magas elvárásokat támasztanak az Apple Siliconnal szemben.

De nem szabad megfeledkeznünk egy fontos tényről: az M1 Macek ára 1000 dollár alatt kezdődik, így ésszerű összehasonlítani őket az 5000 dolláros Xeon(R) Platinum processzorokkal? vagy egy 2000 dolláros Nvidia GPU-val kell versenyezni?

Beállít

Ebben a cikkben összehasonlítom az M1 MacBook Air-emet a gépi tanuláshoz használt mindennapi munkám során használt konfigurációkkal.

Az M1-en telepítettem a TensorFlow 2.4-et Conda környezetben, sok más csomaggal, mint például a pandas, a scikit-learn, a numpy és a JupyterLab, amint azt az előző cikkemben leírtam.

Ez a benchmark egy python programból áll, amely egy sorozatot futtat MLP, CNN és LSTM modellek sorozatában, amelyek a következő témában oktatnak: Fashion MNIST¹három különböző tételmérethez, 32, 128 és 512 mintához.

Validálási készletet is használ, hogy összhangban legyen azzal, ahogy a legtöbb képzést a valós alkalmazásokban hajtják végre. Ezután egy tesztkészlet segítségével értékelik a modellt a képzés után, meggyőződve arról, hogy minden jól működik. Tehát a képzési, érvényesítési és tesztkészlet mérete rendre 50000, 10000, 10000.

Megoldások a TensorFlow 2.4 0.1alpha1 verziójával kapcsolatos problémákra az M1-en

Ma a TensorFlow 2.4 alfa verziója még mindig problémákkal küzd, és bizonyos helyzetekben megfelelő megoldásokra van szükség.

Az „buzgó mód” csak CPU-n működik. A GPU-n való képzéshez ki kell kényszeríteni a grafikon módot. Ezt a következő kód hajtja végre

from tensorflow.python.compiler.mlcompute import mlcompute
from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()

mlcompute.set_mlc_device(device_name='gpu')

print(tf.executing_eagerly())

A betanított modell értékelése két esetben nem sikerül:

  • Grafikon módban (CPU vagy GPU), ha a köteg mérete eltér a betanítási köteg méretétől (kivételt jelent)
  • Mindenesetre az LSTM esetében, ha a köteg mérete kisebb, mint a betanítási köteg mérete (nagyon alacsony pontosságot ad vissza eger módban)

A megoldás egyszerűen abból áll, hogy mindig ugyanazt a kötegméretet állítjuk be a képzéshez és az értékeléshez, mint a következő kódban.

model.evaluate(test_images, test_labels, batch_size=128)

Modellek

A három modell meglehetősen egyszerű, és az alábbiakban foglaljuk össze.

MLP

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=X_train.shape[1:]),
    tf.keras.layers.Dense(512,activation='relu'),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(64,activation='relu'),  
    tf.keras.layers.Dense(10,activation='softmax')
])

CNN

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32,(3,3),activation = 'relu',input_shape=X_train.shape[1:]),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

LSTM

model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(128,input_shape=X_train.shape[1:]),
    tf.keras.layers.Dense(10,activation='softmax')
])

Mindegyik a következő optimalizáló és veszteség funkciót használja.

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

A tf.keras.dataset divatos MNIST-je egész számmal rendelkezik, ezért ahelyett, hogy "egy forró tenzorra" konvertálnám őket, közvetlenül egy "ritka kategorikus keresztentrópia" veszteségfüggvényt használok.

Eredmények

A következő diagramok a CPU-on végzett képzések eredményeit mutatják.

A CPU képzésben a MacBook Air M1 minden helyzetben felülmúlja a 8 magos Intel(R) Xeon(R) Platinum példány és az iMac 27 teljesítményét.

A következő diagram megmutatja, hogy más eszközök hányszor lassabbak, mint az M1 CPU.

MLP és LSTM esetén az M1 körülbelül 2-4-szer gyorsabb, mint az iMac 27' Core i5 és 8 magos Xeon(R) Platinum példány. A CNN esetében az M1 nagyjából 1,5-szer gyorsabb.

Íme az M1 GPU eredményei az Nvidia Tesla K80 és T4-hez képest.

A GPU-képzésben a helyzet nagyon eltérő, mivel az M1 sokkal lassabb, mint a két GPU, kivéve egy esetben a K80-on betanított, 32-es kötegmérettel rendelkező convnet-et.

A következő diagram azt mutatja, hogy más eszközök hányszor gyorsabbak, mint az M1 CPU (hogy jobban olvasható legyen, megfordítottam az ábrázolást a CPU hasonló előző diagramjához képest).

Itt a K80 és T4 példányok szinte minden helyzetben sokkal gyorsabbak, mint az M1 GPU. A különbség a tétel méretével még nő is. A K80 körülbelül 2-8-szor gyorsabb, mint az M1, míg a T4 3-13-szor gyorsabb az esettől függően.

Tehát valóban az M1 GPU-t használják, amikor grafikon módban kényszerítjük?

A válasz Igen. Ha megnézzük a GPU-használatot az M1-en edzés közben, az előzmények 70–100%-os GPU-terhelés átlagot mutatnak, míg a CPU soha nem haladja meg a 20–30%-ot csak egyes magokon.

Nem szabad elfelejtenünk, hogy az M1 egy integrált 8 GPU-mag 128 végrehajtási egységgel 2,6 TFlop-hoz (FP32), míg a T4-ben 2560 Cuda mag van 8,1 TFlops-hoz (FP32). Az ár szintén egyáltalán nem ugyanaz.

Meg kell várnunk, hogy az Apple befejezze az „ML Compute” integrációját a TensorFlow-ba, mielőtt levonnánk a következtetéseket, de még ha a közeljövőben is kapunk némi fejlesztést, nagyon kicsi az esélye, hogy az M1 felvegye a versenyt az ilyen csúcskategóriás kártyákkal. De méltán számíthatunk arra, hogy a következő Apple Silicon processzorok csökkentik ezt a különbséget.

Érdekes tény ezeknél a teszteknél, hogy a GPU-n történő edzés szinte mindig sokkal lassabb, mint a CPU-n történő edzés. A következő grafikonok ezeket a különbségeket mutatják be minden esetben.

Ahogy itt megfigyeljük, a CPU-n való betanítás sokkal gyorsabb, mint a GPU-n az MLP és az LSTM esetében, míg a CNN-n, a 128 minta kötegméretétől kezdve a GPU valamivel gyorsabb.

Az utolsó két diagram összehasonlítja az M1 CPU-n végzett képzést a K80 és T4 GPU-kkal.

Következtetés

Ezekből a tesztekből úgy tűnik

  • MLP képzéséhez az M1 CPU a legjobb megoldás
  • Az LSTM képzéséhez az M1 CPU egy nagyon jó lehetőség, veri a K80-at, és csak kétszer lassabb, mint egy T4, ami nem is olyan rossz, tekintve ennek a csúcskategóriás kártya erejét és árát
  • a CNN edzéshez az M1 a K80 leszállási alternatívájaként használható, csak 2-3 tényezővel, de a T4 még mindig sokkal gyorsabb

Természetesen ezek a mérőszámok csak az ebben a tesztben használt, hasonló típusú és mélységű neurális hálózatok esetén vehetők figyelembe.

Gépi tanulási mérnökként a mindennapi személyes kutatásomhoz a TensorFlow használata a MacBook Air M1-emen valóban nagyon jó lehetőség.

Kutatásaim leginkább a strukturált adatokra és idősorokra koncentrálnak, így még ha néha használok is CNN 1D egységeket, az általam készített modellek többsége Dense, GRU vagy LSTM egységeken alapul, így számomra egyértelműen az M1 a legjobb választás.

A főként convnet-tel dolgozók számára az Apple Silicon M1 jelenleg nem meggyőző, így a dedikált GPU továbbra is járható út.

Az Apple még mindig dolgozik az ML Compute integráción a TensorFlow-ba. Ha valamelyik új kiadás jelentős teljesítménynövekedést mutat valamikor, ennek megfelelően frissítem ezt a cikket.

Köszönöm hogy elolvastad.

Frissítés

Egy olvasó megjegyzése után kétszer is ellenőriztem a 8 magos Xeon(R) példányt. Többszálú feldolgozást használ.

A cikk 2. része elérhető itt.

Források

[1] Han Xiao és Kashif Rasul és Roland Vollgraf, "Fashion-MNIST: új képadatkészlet a gépi tanulási algoritmusok teljesítményértékeléséhez" (2017)