딥러닝을 수행하면서 아래와 같은 에러를 접하게 되었다.

RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1

 

CUDA가 제대로 설치가 안되서 발생한 에러라서 설치하고 재부팅하니까 작동이 잘됐다!

 

해결방법

1. CUDA 설치하기

- driver version에 맞는 version을 설치해야 하고, CUDA version에 맞는 version의 PyTorch를 설치해야 한다.

   1) 본인의 GPU(그래픽카드) 확인하기

       - 나는 GTX 1060 3GB이다!

     2) 확인한 GPU에 맞는 Compute capacity(version) 확인하기 

 https://en.wikipedia.org/wiki/CUDA    

3) CUDA 설치할 버전 확인하기 - 나는 compute capacity가 6.1이니까 10.0-10.1 버전을 설치하면 된다.

4) 설치하기

 - CUDA 10.0-10.1일 경우 아래 명령어로 설치(순서대로 진행하기)

$ pip3 uninstall torch
$ export TORCH_CUDA_ARCH_LIST="6.1"  # --> Compute Capability를 TORCH_CUDA_ARCH_LIST 환경 변수의 값으로 설정한다.
$ pip3 install torch==1.7.1+cu101 torchvision==0.8.2+cu101 -f https://download.pytorch.org/whl/torch_stable.html

 

 

2. 재부팅하기

 

 

 

https://mickael-k.tistory.com/17

리눅스 환경에서 아래 명령어 실행

 find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

 

print()함수

print()  , (comma)로 여러 값을 구분한다.

출력할 때 각각의 값 사이에 공백 한 칸이 추가된다.

Print()함수는 실행 마지막에는 \n으로 줄바꿈이 자동으로 들어간다.

줄을 바꾸지 않고 계속 출력하려면 print(-------, end=’ ‘) end를 추가하면 된다.

또한, 각 출력 값들 사이에 특정한 문자를 넣을 수 있다. Print(1,2,3,4, sep=’/’)하면

1/2/3/4 로 출력이 된다. file을 사용하면 파일에 입출력을 할 수 있다.

>>> f = open('out.txt','w')

>>> print(1,2,3,4,file=f)

>>> f.close()

>>> open('out.txt').read()

'1 2 3 4\n'

 

pprint()모듈 사용

복잡한 데이터를 출력할 때 사용한다.

>>> import pprint

>>> a = ['a',(1,2,3),('z','x',('c',('v','b')))]

>>> a = a* 3

>>> print(a)

['a', (1, 2, 3), ('z', 'x', ('c', ('v', 'b'))), 'a', (1, 2, 3), ('z', 'x', ('c', ('v', 'b'))), 'a', (1, 2, 3), ('z', 'x', ('c', ('v', 'b')))]

>>> pprint.pprint(a)

['a',

 (1, 2, 3),

 ('z', 'x', ('c', ('v', 'b'))),

 'a',

 (1, 2, 3),

 ('z', 'x', ('c', ('v', 'b'))),

 'a',

 (1, 2, 3),

 ('z', 'x', ('c', ('v', 'b')))]

Print() pprint()의 차이가 눈에 들어온다.

구조적으로 출력하여 사용자게 보기에 편하게 출력을 해준다.

특히, JSON 형식의 파일을 읽을 때 보다 편하다!

 

 

Ray효과적이고 단순하게 분산/병렬 컴퓨팅을 수행할 수 있도록 만든 매우 강력한 프레임워크이다.

 

Ray란

주로 병렬처리를 할 때 multiprocessing으로 웬만한 것은 쉽게 실행이 가능하지만, 아래와 같은 단점이 있다.

  • multiprocessing 라이브러리를 사용하기 위해 기존에 작성한 코드를 수정해야 함(Pool 생성해서 넘기기 등)
  • multiprocessing은 여러 클러스터에서 분산처리하기엔 초심자 입장에서 어려움

이를 대체할 수 있는 것이 바로 Ray이다! 그렇다면 Ray의 장점과 특징은?

  • 1) Apache Arrow를 활용하여 데이터를 효율적으로 처리하고 분산 컴퓨팅을 위한 task를 제공
  • 2) 기존 코드에서 약간의 수정만으로 병렬 처리 가능 : 쉽고 범용적인 사용성
  • 3) 멀티프로세싱보다 빠른 성능
  • 4) Dashboard가 존재해서 성능, 로그 등을 확인 가능
  • 5) 머신러닝/딥러닝에서도 활용하기 Good
  • 6) 로컬 환경, 클라우드의 쿠버네티스, 온프레미스 쿠버네티스 등 다양한 환경에서 사용 가능 (자세한 사항은 Windows Support 참고)

 

한 회사에서 성능과 속도를 실험했을때, Ray가 기본 serial python 보다 10-30배 빠르고, multiprocessing 보다 5-25배 정도 빠르다고 한다. 그리고 serial, multiprocessing을 좋은 머신에서 돌린 것보다 5-15배 빠르다고 한다.

Ray를 코드에 적용하는 방법

1.  설치하기

$ pip3 install ray

2. 적용하기

 1. 라이브러리 추가 (import ray)
     
 2. main 함수에서, ray.init() 추가 (Ray 초기화)
     
 3. 병렬처리 하고자 하는 함수 (또는 클래스) 정의 바로 앞에, @ray.remote 데코레이터 추가

 4. 해당 함수를 호출하려면, obj_id = 함수명.remote() (괄호 안에 인자값 넣을 수 있음)
 * obj_id(=object ID, =future, =최종 출력에 대한 참조 값)를 넣는 이유는, 비동기 처리를 위해서.
     
 5. 해당 함수의 리턴값을 받으려면, ray.get(obj_id)
 * 여러 함수들을 실행시켜 놓고, 먼저 끝난 함수부터 우선 처리하려면 ray.wait(obj_id_list) 활용

 

ray API 설명

  • ray.init()
    • ray를 초기화하고 병렬처리할 프로세스를 할당하고 context를 초기화, dashboard를 띄운다.
  • @ray.remote
    • 파이썬 함수를 Ray Task로 만들어주는 데코레이터
  • ray.remote()
    • remote 함수 호출시 사용하는 접미사로 기존 함수의 인자를 받을 수 있다.
    • 리턴 값은 ObjectRef인데, ray.get(ObjectRef) 하여 task를 실행하고 남은 값을 반환할 수 있다.
    • remote() 작업은 비동기적으로 실행된다.
  • ray.wait()
    • remote()로 지정된 object들 중 준비가 된 object id를 반환하며 task가 완료될 때까지 기다리는 역할을 함.
  • ray.get()
    • ObjectRef(object id)를 인자로 받아 object value를 반환
    • ray.get()은 동기적으로 실행
  • ray.shutdown()
    • ray.init()으로 할당된 프로세스를 종료하고 워커와의 연결을 끊는다.
    • Ray를 사용한 파이썬 프로세스가 종료되면 자동으로 이 코드가 실행됨 (jupyter에서는 직접 호출해야함)

자세한 예시는 https://zzsza.github.io/mlops/2021/01/03/python-ray/ 참고!

+ Recent posts