ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RTX a6000 pytorch 버전 문제 해결
    리눅스(Ubuntu) 2021. 10. 28. 20:04

    GPU를 사용하여 deep learning 코드를 돌릴 때 종종 아래와 같은 Runtimeerror를 볼 수 있다.

    Unable to find a valid CuDNN algorithm to run convolution

     

    위와같은 에러가 생기는 이유는 대표적으로 1. memory 정리가 되어있지 않아서 2. 기존 pytorch cuda 등의 버전이 서로 맞지 않아서 이다. 오늘은 RTX a600 GPU를 사용 중일 때 해당 에러를 해결하는 방법을 두 가지 경우로 나누어 설명하도록 하겠다.

     

    1. memory 정리 문제

    memory가 꽉 차있어서 에러가 나는 것이라면 1)현재 컴퓨터 메모리가 가득 차 있거나 2) 현재 돌리고 있는 모델이 너무 무거운 경우이다. 1)의 경우 단순히 python 혹은 jupyter notebook에서 image를 crop 해주거나 batch size를 변경해줘서 해결하면 되지만, 2)의 경우에는 리눅스 터미널에서 간단하게 작업해주어야 하는 몇 코드가 있다. 

    2-1) nvidia-smi에서 GPU 사용량 확인 및 현재 돌아가고 있는 python 종료시키기

    nvidia-smi
    ps aux | grep python
    sudo kill -9 [pid]

    먼저 nvidia-smi로 현재 GPU 사용량이 어떤지 확인한 다음, ps aux | grep python 코드를 통해 현재 실행 중인 python들은 무엇인지, 그리고 그들의 pid무엇인지 확인한다. 그 다음 실행 중이라 표시된 pid를 하나씩 kill해 준 다음 다시 nvidia-smi를 통해 GPU 사용량 변화를 보면 된다.

    2-2) cache 비우기

    free -m
    sync
    sudo sysctl -w vm.drop_caches=1
    sudo sysctl -w vm.drop_caches=2
    sudo sysctl -w vm.drop_caches=3
    free -m

    리눅스 시스템에서 free는 메모리의 전반적인 부분을 빠르게 캐치할 수 있는 명령어이다. 만약 buffer / cache 부분에서의 숫자가 크다면 sysctl -w vm.drop_caches 명령어를 통해 캐시를 삭제할 수 있다. 

     

    2. 버전 충돌 문제

    만약 1의 방법으로 에러가 해결된다면 매우 다행이지만.. 실제로는 버전 충돌 때문에 해당 에러가 발생했을 가능성이 매우 크다. 그럴 경우 내 GPU와 하드웨어에 맞는 올바른 버전을 사용해야하기 때문에 맞는 버전을 찾기는 매우 힘들다. 다행히 스택 오버플로우나 깃헙에서 나와 비슷하게 버전문제로 에러가 나오는 사람들이 존재했었고 누군가의 도움으로 나는 저 에러를 해결할 수 있었다. 아래는 최근에 내가 참고한 깃헙 사이트이다.

    https://github.com/pytorch/pytorch/issues/52288

     

    We need rtx A6000 sm_86 and cuda 11.2 support · Issue #52288 · pytorch/pytorch

    I just received my new rtx A6000 to find out I can't run it with pytorch because it uses sm_86 which uses cuda 11.2. Will pytorch soon support this card? Is there a workaround? Thanks. cc @malf...

    github.com

     

    RTX a6000을 쓰면서 내가 처음 저 에러를 접했던 것은 2021년 9월 9일이였고, 어떤 사이트에서 RTX a6000는 파이토치 버전 1.7.1을 사용해야한다는 글을 보고 아래처럼 새로운 가상환경을 세팅하여 문제를 해결했었다.

    pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0

    다행히 이 이후 별다른 런타임 에러없이 잘 돌아갔지만, 문제는 10월 26일 ResNext로 메모리 에러를 얻고 난 후 발생하였다. 모델 크기가 너무 커서 메모리 에러가 발생하였고, 그 이후 모든 캐시를 삭제해주었으며 실행중인 python을 중단시키고 다시 기존의 가벼운 모델들을 실행시키려고 했는데 갑자기 (바로 어제까지도 잘 돌아갔던 코드가) 계속 cudnn 에러가 나기 시작하였다.

    재부팅을 시켜보고, 캐시를 비워보고, pytorch 1.7.1의 새로운 가상환경을 만들어보고 모든 방법을 총동원했지만 해결하지 못했다. 그러던 도중 위 사이트를 발견하게 되었고 누군가의 아래와 같은 환경을 setting해주라는 글을 보게 되었다.

    conda create -n a6000 python=3.8 pytorch cudatoolkit=11.1 -c pytorch -c nvidia

    정말 다행히도 cuda 11.1 버전의 새로운 가상환경을 만들었더니 코드가 돌아가기 시작했고, 현재는 열심히 Densnet이 돌아가고 있는 중이다.

    앞으로 GPU를 교체했을 때, 또는 갑자기 cudnn 런타임 에러가 발생한다면 침착하게 구글에 내가 가진 GPU 모델명과 에러메세지, 혹은 cuda version을 검색해보는 것을 추천한다.

    댓글

Designed by Tistory.