본문 바로가기

컴퓨터/머신러닝 (Machine Learning)

WSL2, AMD GPU, DirectML 환경에서 Yolov4 돌려보기

시스템 사양 (환경)

CPU - 3700X

Memory - 64GB

Mainboard - Msi, MAG B550M MORTAR

GPU - RX 6800 (reference)

WSL - Ubuntu 20.04

 

WSL2 에서 AMD GPU (RX 6800)을 사용해, Yolov4를 돌려보고자 한다.

 

영상 딥러닝을 하려는 경우 그래픽 카드는 필수적이다.

Nvidia와 AMD가 대표적인 그래픽 카드 제조사인데, 딥러닝을 위해서는 서로 다른 방법이 필요하다.

  • Nvidia 그래픽카드의 경우 고민할것 없다.
    그냥 CUDA와 cudnn 버전 잘 맞춰서 설치하고 돌리면 된다.
    (WSL에서도 가능한 것으로 알고있다. Enable NVIDIA CUDA on WSL 2 | Microsoft Docs)
  • AMD 그래픽 카드의 경우, 딥러닝을 하기위해서는 두 가지 방법이 있는데,
    WSL이 아닌 정식 리눅스에서 ROCM을 통하는 것과
    WSL에서 DirectML을 통하는 것이다.

DirectML의 경우 Tensorflow 1.1.5버전까지만 지원해서 사용하기 불편했으나,

최근에 (2022년 6월 22일) Tensorflow 2를 지원하는 업데이트를 하였다.

 

필자는 AMD 그래픽카드만 보유하고 WSL을 사용중이므로 DirectML을 이용해서 Yolov4를 돌려보았다.

 

순서는 아래와 같다.

1. DirectML 환경 구축

2. Yolov4 테스트

 

1. DirectML 환경 구축

공식가이드 링크는 아래와 같다.

 

DirectML Plugin for TensorFlow 2 | Microsoft Docs

 

DirectML Plugin for TensorFlow 2

Enable DirectML for TensorFlow 2.9

docs.microsoft.com

 

1-1. WSL 버전 확인 및 업데이트

공식 가이드에 따르면 WSL 커널 버전 5.10.43.3 이상의 버전으로 업데이트 해 줘야한다.

ubuntu shell에서 'uname -r' 입력

 

현재 시스템은 구버전으로 확인된다.

업데이트를 위해 관리자 권한으로 실행된 powershell에서

wsl --update 를 입력하면 아래와 같이 업데이트가 될 것이다.

안될 시 참고: https://superuser.com/questions/1709437/how-can-i-update-the-kernel-in-wsl2-kernel-to-latest-release

 

How can I update the kernel in WSL2 kernel to latest release?

The current kernel version in my WSL2 subsystem is: 5.10.60.1-microsoft-standard-WSL2 However, I see in the official Microsoft WSL GitHub repo there is a newer version of the kernel: linux-msft-ws...

superuser.com

 

 

그리고는 안내에 따라 wsl 을 full restart 해준다.

 

 

Powershell에서 wsl --shutdown 후 ubuntu를 다시 켜서 커널 버전을 확인하였다.

 

1-2. Python 버전 확인 및 업데이트 (가상환경 사용)

Tensorflow 2를 위한 DirectML에서의 tensorflow 버전과 python 버전은 각각 2.9 이상, 3.7 이상이다.

이미 특정 python과 관련된 패키지들을 사용하고 있는데

다른 버전의 python과 관련 패키지 설치는 상당히 조심스럽다. (나중에 알수없는 패키지 오류들이 발생할 수 있다)

이를 위해서 mini conda를 이용한 가상환경을 사용하겠다.

가상환경을 사용하면 특정 버전의 패키지 또는 python에 호환이 되는 패키지들만 독립적으로 가상 환경에 구축하게 되므로 패키지 버전에서 오는 이슈들을 예방할 수 있다.

 

먼저 mini conda를 다운로드 하자.

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 입력

 

 

그 후 바로 bash Miniconda3-latest-Linux-x86_64.sh 를 입력하여 설치 (사진과 같이 뭘 좀 쳐줘야 한다)

 

 

진행하다보면 아래 사진과 같이 될텐데, Enter를 쭉 누르면 내려간다

 

 

아래의 완료된 화면을 보면, shell을 껐다 키면 뭔가 있다고 한다.

 

 

껐다가 켜보면 아래처럼 (base) 가 앞단에 붙는데,

이것의 의미는 base라고 이름 붙여진 가상환경에 있다는 뜻이다.

 

 

DirectML 공식 가이드에 따라서 가상환경을 만들어주자

conda create --name tfdml_plugin python=3.7 입력

(tfdml_plugin이라는 이름을 가지고 python 3.7 이 설치된 가상환경을 만든다는 의미이다

공식 가이드에서는 3.9버전을 받는 것으로 안내하고 있을 것이다.

3.9버전은 yolov4에서 필요로 하는 opencv버전과 맞지 않으므로 python 3.7 을 설치한다

관련링크 ERROR: Could not find a version that satisfies the requirement opencv-contrib-python==4.1.1.26 · Issue #137 · piwheels/packages · GitHub)

 

 

여러 기본 패키지들을 설치할 거냐고 물을텐데 y 를 입력한다.

설치 후 conda env list 를 입력해 보면 설치된 환경들과 * 기호로 활성된 환경을 확인할 수 있다.

 

 

conda activate tfdml_plugin 을 입력하면 해당 환경을 활성화 한다.

(앞 부분이 base에서 tfdml_plugin으로 바뀌는 것을 볼 수 있다.)

 

참고로 가상환경을 지우는 명령어는 conda env remove -n 환경이름 이다.

 

1-3. tensorflow와 directml-plugin 설치

tfdml_plugin 환경이 활성화 된 상태에서

pip install tensorflow-cpu==2.9를 입력하여 tensorflow를 설치한다.

(GPU를 쓸건데 cpu 버전을 왜 설치하는지 궁금할 수 있다,
필자가 해봤는데 cpu버전이 아닌걸 받으면 오류가 난다. 또한, cpu버전을 설치해도 gpu 잘 쓰는것을 확인했다.)

 

 

tensorflow 설치가 완료되면 pip install tensorflow-directml-plugin 을 입력하여 plugin을 설치한다.

 

 

이로써 환경 세팅은 완료!

 

2. Yolov4 테스트

DirectML 개발팀 github에서 제공하는 Yolov4 관련 링크들을 따라가며 Yolov4 세팅을 했고 돌려보았다.

참고한 링크들은 아래와 같다.

 

DirectML/Samples/yolov4 at master · microsoft/DirectML · GitHub

 

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

GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Convert YOLO v4 .weights tensorflow, tensorrt and tflite

 

GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Co

YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Convert YOLO v4 .weights tensorflow, tensorrt and tflite - GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLO...

github.com

 

 

2-1. yolo 모델 웨이트 다운로드 하기

사전 학습된 yolo model weight를 먼저 다운 받는다.

wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights입력

 

 

2-2. Tensorflow 용 yolov4 깃에서 다운받기

GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Convert YOLO v4 .weights tensorflow, tensorrt and tflite

 

GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Co

YOLOv4, YOLOv4-tiny, YOLOv3, YOLOv3-tiny Implemented in Tensorflow 2.0, Android. Convert YOLO v4 .weights tensorflow, tensorrt and tflite - GitHub - hunglc007/tensorflow-yolov4-tflite: YOLOv4, YOLO...

github.com

위 링크에 접속하여 코드를 클릭한 후 HTTPS 주소를 복사한다. (사진의 붉은 체크들을 클릭)

 

 

주소를 복사한 후 git clone 복사한 주소 붙여넣기 를 하면 모델 코드를 다운받는다.

(git clone https://github.com/hunglc007/tensorflow-yolov4-tflite.git)

 

 

다운받은 후 이전에 받은 yolov4 wegith 파일을 받은 깃 디렉토리에서 data 폴더 안으로 옮겨준다.

mv yolov4.weights tensorflow-yolov4-tflite/data 입력

 

 

2-3. Yolov4 구동을 위한 패키지 설치

yolov4 구동을 위한 패키지들은 이전에 받은 깃헙 폴더 내에 requirement.txt 파일에 기록되어 있다.

확인해 보자. 해당 디렉토리로 이동한 후 sudo nano requirements.txt 입력

 

 

위의 필수 패키지들 중 tensorflow는 이미 2.9 버전으로 설치하였으므로 해당부분을 지우거나 주석처리 한다.

이후 ctrl + x 로 저장하면서 종료

pip install -r requirements.txt 를 입력하여 필수 패키지 설치

 

 

2-4. Yolov4 구동 준비 및 구동

미리 다운받은 weight를 모델에 연결(?) 한다.

python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4 입력

 

 

사진에 보면 DirectML을 통해서 AMD 그래픽 카드가 (RX 6800) 잘 연결되었고 model 가 프린트 되어야 한다.

오류가 난다면 어디선가 잘못된 것이다.

 

python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/kite.jpg 를 입력하면 demo 파일에 (kite.jpg) 대해서 yolov4를 돌려준다.

 

 

돌려서 나온 파일을 ubuntu 폴더로 가서 확인하면

 

 

이렇게 bounding box를 친 결과를 저장해 준다.

 

인터넷에서 아래의 사진을 다운받아서 돌려보았다.

 

 

결과는

 

 

잘 된다.

이후 글에서는 webcam에서 연동/비디오 파일에서 돌리기 (비교적 간단)/다른 detection 관련 모델 접목하기 등을 해볼 계획이다.

끝!