2. RuntimeError: CUDA error: out of memory 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.
그 다음 윈도우 + R 키로 윈도우 cmd 창을 연다 (주의: anaconda prompt 아님!)
ssh -NfL localhost:{local에서 쓸포트번호}:localhost:{원격포트번호} {원격id}@{원격ip}
# or 원격 서버를 연결하기 위한 포트번호가 있을 시
ssh -NfL localhost:{local에서 쓸포트번호}:localhost:{원격포트번호} {원격id}@{원격ip} -p {원격기본설정 포트}
그 다음 위 커맨드를 쳐서 원격서버와 로컬서버의 포트번호를 연결해준다
이때 주의점은 {원격포트번호}와 {원격기본설정 포트}는 다르다는 점이다.
(이걸 검색해서 여기까지 온사람이라면 차이를 알겠지만 혹시나,,,)
# {local에서 쓸 포트번호}
아무거나 내 로컬에서 사용하지 않는 포트번호로 지정해주면 된다. -> 이값을 3번에서 사용할 예정
# {원격포트번호}
나같은 경우는 {원격포트번호}에 1번에서 지정해준 6007을 썼고,
1번에서 포트 번호 지정은 안했다면 6006을 사용하면 된다.
# {원격기본설정 포트}
이는 원격 서버에 설정된 포트 번호가 있다면 지정해주면 된다. 보통 22로 설정되어 있는 그 포트번호 말하는 것이다.
# 앞으로 돌려봐야할 것
from nvidia.dali.pipeline import Pipeline
from nvidia.dali import pipeline_def
import nvidia.dali.fn as fn
import nvidia.dali.types as types
from nvidia.dali.plugin.pytorch import DALIGenericIterator
import torchvision.models as models
resnet18 = models.resnet18()
from time import time
data_dir = "./test_DALI/images/"
@pipeline_def(batch_size=128, num_threads=4, device_id=0)
def get_dali_pipeline(data_dir, crop_size):
images, labels = fn.readers.file(file_root=data_dir)
# decode data on the GPU
images = fn.decoders.image_random_crop(images, device="mixed", output_type=types.RGB)
# the rest of processing happens on the GPU as well
images = fn.resize(images, resize_x=crop_size, resize_y=crop_size)
images = fn.crop_mirror_normalize(images,
mean=[0.485 * 255,0.456 * 255,0.406 * 255],
std=[0.229 * 255,0.224 * 255,0.225 * 255],
mirror=fn.random.coin_flip())
return images, label
train_data = DALIGenericIterator(
[get_dali_pipeline(data_dir, (224, 224))], ['data', 'label'], reader_name='Reader')
for i, data in enumerate(train_data):
x, y = data[0]['data'], data[0]['label']
pred = resnet18(x)
# loss = loss_func(pred, y)
# backward(loss, model)
from Detection.A.a import {a.py 내에 있는 함수 이름}
from Detection.B.bb import {bb.py 내에 있는 함수 이름}
같은 함수를 detect.py 내에서 import 할때에는 아래와 같이 하면 된다.
(detect.py를 실행하는 경로는 ROOT/detection이니까)
from A.a import {a.py 내에 있는 함수 이름}
from B.bb import {bb.py 내에 있는 함수 이름}
문제는, detect.py와 test.py가 둘다 A.a를 import 하는데
다시 A.a가 C.c를 import 하는 상황이다. (실제로는 폴더가 한 5개정도 됐음,,,,,🤣)
이게 왜 문제냐면,
A.a를 test.py도 import 하고, detect.py도 A.a import 해야하는데,
test.py -> A.a.py -> C.c.py 일때는 실행하는 경로가 ROOT이고
detect.py -> A.a.py ->C.c.py 일때는 실행하는 경로가 ROOT/Detection 이었다.
(물론 ROOT에서 python Detection/detect.py로 실행하면 문제가 없지만, 내 경우에는 Detection 내에서 실행을 해야했다)
그럼 A.a.py는 from C.c import {C.c에 있는 함수}로 import 하면 test.py 실행시 문제가 생기고
from Detection.C.c import (C.c에 있는 함수)로 import 하면 detect.py 실행시에 문제가 생긴다 😥
이를 해결하기 위한 방법은 크게
1. CLI 커맨드로 bash 자체에 영구적으로 export PYTHONPATH 하는 방법 (영구해결)
2. python 파일 최상단에서 sys.path에 ROOT/Detection 폴더를 추가해주는 방법
(해당 프로세스나 창이 꺼지면 리셋되는 듯?)
근데 1번은.. 내가 잘 이해를 못한건지,,,종종 잘 안되는 경우가 많아서ㅜ
이렇게 아래처럼 전체 파일에 python path로 root path를 붙여주면 제일 잘되는거 같다
이렇게 하면 파일이 실행되는 ROOT 경로를 system path에 추가해주기 때문에
import error를 일으키는 파일 위에 추가를 해주거나 가장 상위 파일에 추가를 해주면 대부분 문제가 없다.
import os
import sys
from pathlib import Path
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0] # root directory
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # add ROOT to PATH
아래는 좀더 심플한 버젼! 근데 위 코드가 더 general하게 error 안날꺼 같다.
import os, sys
if not os.getcwd().endswith("Detection"):
sys.path.append(os.getcwd() + "/Detection")