Data Navigator

DirectML : AMD, radeon, intel 내장그래픽을 사용한 딥러닝 GPU 가속 본문

Python

DirectML : AMD, radeon, intel 내장그래픽을 사용한 딥러닝 GPU 가속

코딩하고분석하는돌스 2024. 2. 16. 16:14

AMD, radeon, intel 내장그래픽을 사용한 딥러닝 GPU 가속

 

딥러닝을 공부하다가 보면 학습을 시키는데 시간이 너무 오래 걸리는 경우가 발생한다.

NVIDIA의 그래픽 카드가 있다면 좋겠지만 가격이 비싸고, 내장그래픽만 있는 노트북에서 작업한다면 그래픽카드 추가가 불가능하기 때문에 CPU만 사용해서 오랜시간 학습을 시켜야 하는 상황이 생긴다.

Google colab을 써서 GPU를 사용할 수도 있지만 연결이 갑자기 끊길 때도 많고 유료 버전을 사용하다고 해도 최대 사용시간과 학습중 갑자기 연결이 끊기는 경우는 언제든 발생할 수 있다.

 

NVIDIA GPU가 없더라도 AMD CPU에 내장된 그래픽카드나 INTEL CPU에 내장된 그래픽 카드로도 딥러닝 학습시 GPU 가속을 할 수 있는데, 그것은 바로 DirectML을 이용한 방법이다.

단, DirectML은 순수 Linux에서는 실행되지 않고 windows에서 wsl2로 설치한 ubuntu Linux 에서만 작동한다. 

그리고 tensorflow, pytorch 모두 directML을 이용해 내장그래픽 가속을 할 수 있지만 패키지 의존성 문제로 하나의 가상환경에 설치할 수 없고 tensorflow용과 pytorch용 가상환경을 따로 만들어서서 각각 설치해야 한다.

 

 

DirectML에 대한 Github 링크는 아래와 같다.

 

https://github.com/microsoft/DirectML

 

GitHub - microsoft/DirectML: DirectML is a high-performance, hardware-accelerated DirectX 12 library for machine learning. Direc

DirectML is a high-performance, hardware-accelerated DirectX 12 library for machine learning. DirectML provides GPU acceleration for common machine learning tasks across a broad range of supported ...

github.com

 

windows에서 directML로 tensorflow나 pytorch를 사용하면 tensorflow 는 1.x 버전, pytorch도 1.13버전만 쓸 수 있다.

2.x 버전의 tensorflow, pytorch를 사용하고 싶다면 Windows Subsystem Linux(WSL)을 이용하는 것이 좋다.

WSL 설치 및 설정은 이전 글 참조.

 

https://datanavigator.tistory.com/61

 

WSL2 Ubuntu 설치, 목록확인, 삭제

WSL2 Ubuntu 설치, 목록확인, 삭제 윈도우에서 리눅스를 사용하기 위해서는 WSL 을 설치하고 Ubuntu나 CentOS 같은 리눅스 배포판을 사용하면 편리하다. 1.시작 버튼 옆 검색에서 PowserShell 검색 2. PowserShel

datanavigator.tistory.com

 

 

1. windows WSL에서 tensorflow + DirectML로 딥러닝하기

https://learn.microsoft.com/ko-kr/windows/ai/directml/gpu-tensorflow-plugin

 

DirectML Plugin for TensorFlow 2

Enable DirectML for TensorFlow 2.9

learn.microsoft.com

 

1) 콘다 가상환경에 dmltf 가상환경 만들기

microsoft directML 공식 페이지에서 파이썬 3.9로 예시를 들고 있기 때문에 파이썬 3.9로 가상환경 생성

conda create -n dmltf python=3.9

 

 

2) 생성한 dmltf 가상환경 활성화

conda activate dmltf

 

3)  pip 를 이용해서 tensorflow-cpu 2.10버전 설치 

pip install tensorflow-cpu==2.10

 

 

4)  pip 를 이용해서 tensorflow-directml-plugin 설치 

pip install tensorflow-directml-plugin

 

 

5) jupyter notebook 6 버전 설치

pip install notebook==6.*

 

 

6) scikit-learn matplotlib seaborn imbalanced-learn scikit-image xgboost lightgbm  등 설치

pip install scikit-learn matplotlib seaborn imbalanced-learn scikit-image xgboost lightgbm

 

 

 

7) pip 를 이용해 numpy 1.26.4 버전 설치      중요!!

위의 패키지들을 설치하고나면 numpy가 2.0.2 버전이 설치된다. 

그런데 directml은 numpy1.26.4에서 작동되기 때문에 추후에 따로 numpy 1.26.4 버전으로 설치해주어야 한다.

새로 설치하는 패키지중에 numpy를 업그레이드 해야하는 것이 있다면 directML과 동시에 사용할 수 없다.

pip install numpy==1.*

 

8) 주피터 노트북 실행 및 GPU 테스트

주피터 노트북을 실행하고 아래의 코드를 실행 했을 때 사용 가능한 GPU: 1개 가 나오면 정상

import tensorflow as tf

# 사용 가능한 GPU 목록 출력
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
    print(f"사용 가능한 GPU: {len(gpus)}개")
    for gpu in gpus:
        print(gpu)
else:
    print("GPU가 사용 불가능합니다.")

 

2. windows WSL에서 pytorch + DirectML로 딥러닝하기

https://learn.microsoft.com/ko-kr/windows/ai/directml/gpu-pytorch-wsl

 

Enable PyTorch with DirectML on WSL 2

This preview provides students and beginners a way to start building your knowledge in the machine-learning (ML) space on your existing hardware by using the **PyTorch with DirectML** package.

learn.microsoft.com

 

1) python 3.10으로 콘다 가상환경 생성 

conda create -n dmltorch python=3.10

 

 

2) 가상환경 활성화 

conda activate dmltorch

 

 

 

3) directML용 pytorch 설치. (pytroch 2.2버전까지만 지원함)

pip install torch-directml

 

 

 

4) jupyter notebook 6 버전 설치

pip install notebook==6.*

 

5) scikit-learn matplotlib seaborn imbalanced-learn scikit-image xgboost lightgbm  등 설치

pip install scikit-learn matplotlib seaborn imbalanced-learn scikit-image xgboost lightgbm

 

* pytorch용 directML을 설치할 때는 numpy 버전을 다운그레이드 하지 않아도 됨

 

6) 주피터 노트북에서 directML로 pytorch 가 GPU로 작동하는지 확인

아래의 코드를 실행했을 때 DirectML을 통한 GPU 사용 가능과 결과값이 3이 나오면 정상 작동

import torch
import torch_directml

# DirectML 디바이스 생성
device = torch_directml.device()

# 사용 가능한 DirectML 디바이스 출력
if device:
    print(f"DirectML을 통한 GPU 사용 가능: {device}")
else:
    print("DirectML을 통한 GPU가 사용 불가능합니다.")

dml = torch_directml.device()
tensor1 = torch.tensor([1]).to(dml) # Note that dml is a variable, not a string!
tensor2 = torch.tensor([2]).to(dml)
dml_algebra = tensor1 + tensor2
dml_algebra.item()