기술나눔

[AIGC] 2. Mac은 로컬에서 GPU를 사용하여 keras 계산을 시작합니다.

2024-07-12

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

Mac은 로컬에서 GPU를 사용하여 keras 컴퓨팅을 시작합니다.

1. 문제 배경

이전 기사에서 우리는 대형 모델을 운영할 때 CPU를 사용하여 작업할 때 CPU 사용량이 매우 높다는 것을 발견했습니다. 그러므로 여기서 우리는 머신에 GPU 그래픽 카드가 있다면 어떻게 하면 벡터 연산에서 그래픽 카드를 활용하고 머신러닝 관련 연산을 빠르고 잘 수행할 수 있을지 생각해 보겠습니다.

2. 기술적 배경

현재 기계 학습을 지원하는 주류 그래픽 카드는 일반적으로 N 카드로 알려진 Nvida 시리즈 그래픽 카드라는 것을 알고 있습니다. 그러나 Mac 컴퓨터에는 일반적으로 AMD 시리즈 그래픽 카드가 통합되어 있습니다. 서로 다른 두 하드웨어 명령어 세트의 차이로 인해 상위 계층에서는 서로 다른 구현 기술이 필요하게 됩니다.
하지만 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의 구성 특성을 이해한 학생들은 이를 가상 환경에서 직접 사용해 볼 수 있습니다.

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_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를 다시 빌드합니다.

Step 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초 891ms/단계
0.9295139312744141초만에 실행됨
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 923ms/단계
1.8894760608673096초만에 실행되었습니다
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 893ms/단계
2.818492889404297초만에 실행됨
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 932ms/단계
3.7831668853759766초만에 실행됨
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 892ms/단계
4.71358585357666초만에 실행되었습니다
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 860ms/단계
5.609835863113403초만에 실행되었습니다.
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 878ms/단계
6.5182459354400635초만에 실행되었습니다.
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 871ms/단계
7.423128128051758초만에 실행됨
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 896ms/단계
8.352543830871582초만에 실행됨
1/1 ━━━━━━━━━━━━━━━━━━━━ 1초 902ms/단계
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

초기 배치 실행(타일 프로그램 컴파일)

출력 속도가 더 빠르기 때문에 한 줄의 내용만 인쇄됩니다.

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

초기 배치 실행(타일 프로그램 컴파일)

출력 속도가 더 빠르기 때문에 한 줄의 내용만 인쇄됩니다.

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의 메모리 값은 1536MB입니다. 비록 그래픽 카드로서 계산 성능은 이 기기의 6코어 CPU만큼 좋지 않습니다.
그래픽 카드 metal_amd_radeon_pro_5300m.0의 메모리 값은 4G이며 기본 CPU와 비교하면 성능이 거의 1배 더 높습니다.

이를 통해 기계 학습 작업에 GPU를 사용하면 얻을 수 있는 강력한 이점을 확인할 수 있습니다.