github 내가 자주 쓰는 커맨드들 한번 정리하긴 해야되는데...

매번 생각하면서 일단 오늘은 오늘 해결한 에러부터 아카이빙!

 

vscode에서 github을 쓰면 자동으로 commit tracking도 해주고, 

privae repository push pull할때 비번도 저장해주고 좋은 기능이 많긴한데, 

가끔은 쓸데 없이 강한 보안을 보이기도 한다...

오늘 만난 에러도 그 중 일부

 

에러메세지: 

Missing or invalid credentials.
Error: connect ECONNREFUSED /run/user/1022/vscode-git-131701c717.sock

 

 

git clone, push, pull 등등에서 요즘 반복적으로 이런 에러를 만난다. 

 

해결책1. 비슷한 권한 문제가 요즘 많이 생겨서 

git.name, email, 비번을 저장해서 일시적으로 해결했다

 

git config --global user.name {이름}
git config --global user.email {이메일}

아래는 github 계정의 토큰을 내가 사용하려는 원격저장소에 한해서 저장하는 방법이다

단, clone은 이미 진행되어서 로컬-원격이 연결된 상태에서 사용가능한다. 

git remote set-url origin https://{토큰}@github.com/{연결하려는 저장소 유저 이름}/{레파지토리}.git
# ex. git remote set-url origin https://{토큰}@github.com/Seonjipark/SNU_FaceDetection.git

# github access token을 모른다면 아래 게시글 참조해서 발급받고 저장해둘 것!

https://curryyou.tistory.com/344

 

GitHub 토큰 인증 로그인: Personal Access Token 생성 및 사용 방법

Git Hub에서 ID/PW기반의 Basic Authentication 인증을 금지하고, ID/Personal Access Token 방식의 Token Authentication 인증을 요구하고 있다. 앞으로는 소스코드를 push/clone하려고 하면, 아래와 같은 문구가 뜨면서

curryyou.tistory.com

 

 


해결책2. 근데 1번 방법으로 해결해줘도 authentic error가 계속 일어나고, 

심지어 이건 clone시에는 사용하지도 못한다

그래서 검색해본 결과 vscode가 문제라는 것을 알 수 있었고

settings에 git.terminal을 검색해서 Git:Terminal Authentication 체크박스를 해제해주면 문제가 없어진다

 

오늘도 해결완료!

세상에서 제일 짜증나는 상황 중 하나..

nvidia-smi하면 GPU util은 분명 먹고 있으나 process name에는 안잡히는 상황이 종종 생긴다 

생긴다고 듣기만 했지 내가 만난 적은 두번째였고 

첫번째는 선배가 알아서 꺼줘서 내가 해결해본적이 없어서 오늘은 내가 해결해야했다 ! 

 

일단 첫번째는 구글링 & chatGPT.. 

chatGPT의 추천대로 

nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

위 커맨드로 검색하니 진짜 PID는 나온다 !! 

 

근데 PID는 뜨는데 kill -9 PID를 치면 No such process라고 뜨는 얼척 없는 상황 발생..?

 

대충 이런 상황이 내가 쓰던 메모리들이

CPU-GPU단에서 기존 프로세스 종료할 때 종료되지 않고

잔여한 상황이라는 거는 알아서 PID로 정상적으로 한번에 종료되진 않을 수도 있다고는 생각했지만

뭐라고 검색해야할 지 몰라서 막막한 상황...

 

결국 htop가 nvidia-smi보다 정확할테니 

htop로 들어간 후 MEM 기준으로 sorting하니 상위 프로세스가 떠서 

상위에 뜨는 PID들을 하나하나씩 다 삭제해주니 결국 util이 0이 되었다 

참고로 htop에 뜨는 PID들은 아주 많았고, 위 커맨드로 찾은 8292는 아니었다..

왜 그런지는 자세히는 모르고, 깔끔한 해결책을 찾은 것도 아니지만 일단 해결했으니 아카이빙 😇

 

+) 추가: 이 GPU 유령 memory 문제는 대부분 DDP module이나 dist 모듈 등 

multi GPU를 사용할 때 생기는 문제라는 거를 알아냈다

상황: NeRF 계열 공부중 pytorch3d 를 기존 3090 사용 서버에서 잘 쓰고 있었는데 

서버 옮기면서 CUDA 버전 충돌로 가상환경 설치 실패 2일차...

선배에게 CUDA toolkit-dev에 대한 설명 듣고 이틀더 삽질 후 결국 성공!

누군가 검색해서 들어온 후 도움이 되기를 바라면서 + 내가 나중에 이 error 또 겪을까봐 남기는 로그

 

서버환경: 

CUDA Version: 12.1 

Driver Version: 530.30.02

GPU: Geforce RTX 3090 (ref)

Ubuntu: 18.04 LTS

 

설치해야하는 모듈: pytorch 및 pytorch3d (implicitron 포함)

 

결론: pytoch3d 가이드에서 주는 모듈 설치 순서는 의외로 굉장히 중요하다

stackoverflow 만만세

 

pytorch3d 요약: 

아래 코드가 다 돌아간다면 pytorch3d 자체의 문제는 아닌 것 같다가 내 결론

3번째 줄은 당연 Implicitron을 사용하는 사람들에게 해당하고, 마지막 줄은 대표적인 pytorch3d 설치 경로문제에서 

import 가 안되는 모듈인 것 같다 

import torch
import pytorch3d
import pytorch3d.implicitron
from pytorch3d import _C

아래 순서는 중간중간 기록한 것이 아니라 틀릴 수 있음

 

첫번째 Error: python 3.8 + pytorch 13.1 + conda install pytorch3d

-> pytorch3d 설치를 위해 검사하는 중  CUDA version이 11.7 인데(pytorch 설치 CUDA 버젼) 9.1CUDA를 사용하는 모듈이 있어서 

충돌이 일으켰다는 에러메세지가뜸 

=> 9.1..?을 사용한다는 메세지가 뜨기는 하는데 워낙 충돌로 뜨는 모듈이 많아서 뭐가 뭔지 모르겠는 상황

이래저래 검색을 해봐서 뚜렷한 해결책이 없어서 연구실 동료들한테 SOS 침

=> 선배가 nvcc -V로 뜨는 local CUDA version을 11.7로 맞춰주면 된다는 정보 입수

=> 아직 local CUDA랑 기존 CUDA의 차이를 모르겠는데 공부 필요..

 

첫번째 해결책: 아무튼 torch 설치 -> CUDA toolkit-dev 설치 -> pytorch3d 순으로 설치하면 된다는 꿀정보와 함께 

CUDA toolkit-dev 가 설치하는데 제법 여러시간 소요된다는 절망적인 정보를 함께 얻음... :(

 

CUDA toolkit- dev 설치 방법

: conda install -y -c conda-forge cudatoolkit-dev

 


두번째 Error: (정확히 재보진 않았지만) 약 3-4시간 안쪽으로 걸리는 CUDA toolkit-dev 여러번 설치했는데도 자꾸 꼬임 ㅜ

현상: pip install pytorch3d 로 설치하면 0.7.3버젼이 아닌 0.3.0버젼이 설치되서

from pytorch3d import implicitron하면

"No Module Named implicitron"이 뜨거나 implicitron 안의 일부 모듈이 없다고 뜸

=> implicitron이 설치에러가 많은 듯하여  pytorch3d 공식 문서에 들어가면 여러 issue log에서 도움을 받을 수 있다

 

https://github.com/facebookresearch/pytorch3d/tree/main/projects/implicitron_trainer

 

GitHub - facebookresearch/pytorch3d: PyTorch3D is FAIR's library of reusable components for deep learning with 3D data

PyTorch3D is FAIR's library of reusable components for deep learning with 3D data - GitHub - facebookresearch/pytorch3d: PyTorch3D is FAIR's library of reusable components for deep learning...

github.com

 

 

두번째 해결책: 사실 이건 내가 고오집 부려서 일어난 일인듯....

순서가 틀리면, 특히 저 iopath 설치 순서를 잘못 맘대로 설치하면 환경이 여러번 꼬인다,,,, 

 

pytorch3d 공식 문서와 내가 돌리려고 하는 코드의 매뉴얼을 조합해보면 아래와 같다

conda create -n pytorch3d python=3.8
conda activate pytorch3d
conda install -c conda-forge ninja # 내가 돌릴려는 code의 매뉴얼
conda install -c conda-forge cxx-compiler=1.3.0 # 내가 돌릴려는 code의 매뉴얼
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
conda install -y -c conda-forge cudatoolkit-dev

conda install -c fvcore -c iopath -c conda-forge fvcore iopath
pip install "git+https://github.com/facebookresearch/pytorch3d.git@v0.7.2"
# or
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"

3,4번째 줄은 현재 내가 돌릴려고 하는 코드의 추천 매뉴얼이고 pytorch3d 공식 문서에 해당하는 내용은 아님!!

5번째 줄 pytorch 설치는 내 서버 환경에서는

pytorch 1.11.0 + cudatoolkit 11.3 

pytorch 1.13.1 + cudatoolkit 11.7

위 두개의 조합이 성공했다 

아래 pytorch install 링크에서 각자 환경에 맞게 설치할 것 !! 

https://pytorch.org/get-started/previous-versions/

 

PyTorch

An open source machine learning framework that accelerates the path from research prototyping to production deployment.

pytorch.org

 


세번째 Error: 여까지 이틀 버리고 드디어 pytorch3d.implicitron까지 전부 import가 되고 코드는 돌아가는데..!

새로운 에러 등장... 이쯤에서 걍 다른 서버쓸까 고민함...

그것도 해결책을 검색해보면 죄다 GPU 공간이 없어서 생기는 문제라는 데 나는 아니라구요.. 

사용하려는 GPU memory도 비어있고, GPU 인식 순서가 잘못 인식된 것도 아닌데 

자꾸 아래 메세지 두개가 떴다 

(웃긴건 어떨땐 1번 메세지, 어떨땐 2번 메세지가 뜸... 둘다 검색해보면 GPU memory 문제라고 하는 사람들만 있음 ㅜㅜ )

 

1. RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

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. 

 

https://discuss.pytorch.org/t/runtimeerror-cudnn-error-cudnn-status-not-initialized/115286

 

RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

I am doing training and put the dataset inside the data folder. The Structure looks like this. –data -----mars ---------bbox_train ---------bbox_test ---------info Many developers said that this is a label problem but I am not not sure because labels are

discuss.pytorch.org

 

세번째 해결책: 일단 위의 글을 참고하긴 했는데.. 어쩔땐 저 1번 에러가 결국 CUDA와 torch 버젼의 충돌때문에 일어난다는 거인듯?

원인만 파악하고 나의 경우엔 torch 만 돌릴때는 문제가 없었기 때문에 해답을 못찾았고

더 검색한 끝에 

2번 메세지 문제 해결 + GPU인식 문제 해결을 동시에 하기 위해 아래 코드처럼 python을 실행시키면 된다는 도움을 받았다 


CUDA_LAUNCH_BLOCKING=1 && export CUDA_VISIBLE_DEVICES=0 && python ~~~

 

저 CUDA_LAUNCH_BLOCKING=1 커맨드가 뭘 해결하는 건지는 일단 

실험이 마무리되는 대로 더 공부해야겠지만 드디어 장장 4일의 삽질끝에 가상환경 세팅 완료 !!!

 

다시 행복 대학원생으로 돌아가서 실험만 하면 된다......

이 글을 검색해서 들어오는 모든 3D 연구자들 화이팅 ✌️

pytorch만 쓰다가 visualization의 한계를 깨닫고 tensorboard 툴 공부 중,,,

여차저차해서 tensorboard 코드는 만들었는데, 

코드 실행하는 server는 linux 기반의 ubuntu, 노트북은 macOS, 테스크탑은 window 기반이라 tensorboard 연결하면서 겪은 약간의 시행착오를 정리하려고 한다. 

 

일단 macOS에서는 vscode를 사용하기 때문에 vscode로 연결한 원격 터미넣에서 아래처럼 tensorboard를 켠 후

tensorboard --logdir={log경로}

바로 http://{원격ip주소}:6006을 (6006은 포트 설정 안했을 시 기본설정) 크롬에 입력하면 tensorboard 창이 켜졌다.

 

문제는 window에서는 vscode를 사용하지 않고 모바엑스텀을 사용해서,,,똑같이 하니까 안되더라

검색해본 결과

1. 원격서버에서 포트 지정해서 tensorboard를 열 것(근데 필수는 아님)

2. window cmd에서 NfL로 원격서버와 로컬 연결하기

3. window 크롬에서 주소 입력하기 

 

이렇게 세 단계로 나눠서 하면되는 걸 파악했다. 그러니까 2번 단계가 추가된 것!

 

1. 원격서버에서 아래같이 원격포트번호를 지정해준다. 

이는 실제 원격 서버의 포트번호가 아니라, 텐서보드를 다른사람이 쓰고 있거나 6006을 다른 사람이 쓰고 있는 경우를 방지하기 위해서이다. 나같은 경우는 6007로 진행하였다.

 

tensorboard --logdir {log 폴더 경로} --port {원격포트번호지정}

 

 

2. window에서 cmd에 ssh 클라이언트 기능을 설치한다. 

윈도우 설정 -> 앱 -> 선택적 기능 -> ssh 클라이언트

를 찾아 설치하면 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로 설정되어 있는 그 포트번호 말하는 것이다.

6006과는 아무 상관이 없다. 원격서버에 포트 설정이 안되어 있다면 입력할 필요 없다. 

 

 

3. window 크롬에서 주소 입력하기 

window 로컬컴에서 

http://{원격서버ip}:{local에서 쓸 포트번호}

를 주소창에 입력해주면 된다.

 

 

## 정리

# 원격에서
tensorboard --logdir {log 폴더 경로} --port {A}

# 로컬 window cmd에서 (C는 원격서버 포트 번호가 22(기본설정값)이 아닐 시)
ssh -NfL localhost:{B}:localhost:{A} {원격id}@{원격ip} -p {C}

# 로컬 window 주소창에서
http://{원격서버ip}:{B}

Nvidia 에서 만든 data loading library인 DALI 공부 중

n년전 pytorch가 그랬듯, 툴 자체는 좋아보이는데 아직 사용자가 많지 않은지 error에 대한 정보를 얻기가 힘들다 ㅜ

일단 현재까지 파악한 건,

 

- TF 처럼 define and run 구조. -> 따라서 random 성이 있는 모듈은 구현되어 있지 않음

- pipe를 define할때는 transform을 추가하고, run할 때 transform에 들어갈 변수들을 parameter로 전달

ex. define할때 crop이 들어가면 run할때 crop size를 넣어줌 

 

=> 기본적으론 아래와 같이 돌아가고, custom dataset에서는 어떻게 줘야하는지 자꾸 오류가 나서

     일단 Nvidia측에서 제공하는 dataset으로 이것저것 실험 중

 

=> ToDo: crop 등등 transform하기 / CPU, GPU Mixed 성능비교하기 / torch랑 학습 시간 비교하기


DALI 공식문서

https://docs.nvidia.com/deeplearning/dali/user-guide/docs/

 

NVIDIA DALI Documentation — NVIDIA DALI 1.18.0 documentation

Multiple data formats support - LMDB, RecordIO, TFRecord, COCO, JPEG, JPEG 2000, WAV, FLAC, OGG, H.264, VP9 and HEVC.

docs.nvidia.com

Nvidia에서 DALI repo에 제공하는 dataset

https://github.com/NVIDIA/DALI/tree/main/docs/examples/data/images

 

GitHub - NVIDIA/DALI: A GPU-accelerated library containing highly optimized building blocks and an execution engine for data pro

A GPU-accelerated library containing highly optimized building blocks and an execution engine for data processing to accelerate deep learning training and inference applications. - GitHub - NVIDIA/...

github.com

# 돌리는데 성공한거

def simple_mixed_pipeline():
    jpegs, labels = fn.readers.file(file_root=data_dir)
    images = fn.decoders.image(jpegs, device="mixed")

    return images, labels


if __name__ == "__main__":
    pipe = simple_mixed_pipeline(batch_size=8, num_threads=2, device_id=0)
    start = time()
    pipe.build()
    pipe_out = pipe.run()
    end = time()
    print(pipe_out)
# 앞으로 돌려봐야할 것

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)

Ex. 내가 어제 겪은 상황:

-> detection

   -> A

      -> a.py

   -> B

      -> b.py

      ->bb.py

   -> C

      -> c.py

   -> detect.py

-> test.py

 

가장 상위 폴더에 detection이라는 폴더와 test.py가 있고,

detection 폴더 안에 폴더 A, B, C가 있음. 


test.py와 detect.py는 거의 같은 내용으로 같은 모듈들을 import 해야함

test.py에서 A폴더 내의 a.py, B 폴더내의 bb.py를 import할때는

아래와 같이 하면 되고 (test.py를 실행하는 경로는 가장 상위 경로니까 ) 

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")

외부에서 노트북으로 코딩하느라 갑자기 vim 쓰는 중인데 

아직 단축키 알못이라 ㅜ indentation 맞추기가 너무 빡세다 

 

stackoverflow에 찾아보니까 자동으로 indentation 맞춰주는 방법이 있는 듯 하다

https://stackoverflow.com/questions/235839/indent-multiple-lines-quickly-in-vi

 

Indent multiple lines quickly in vi

It should be trivial, and it might even be in the help, but I can't figure out how to navigate it. How do I indent multiple lines quickly in vi?

stackoverflow.com

뭐 위에 처럼 이런 코드가 있긴 한데 좀더 심플한 방법은 

esc 로 커맨드 모드에 들어간 후 

gg=G

를 순서대로 입력하는 것이다. 

그럼 아래처럼 몇개의 라인이 indentation 교정됐는지를 알려주면서 깔끔하게 복붙해서 밀린 indentation 까지는 맞춰준다 ! 

아래가 결과인데.. data augmentation 코드가 ,)으로 끝나서 그런지 그 이후로가 

의도하지 않은 1tab이 더 들어가져있다. 

흠.. 그래도 이정도면 귀찮음을 90% 정도 해결해주니까 성능은 만족. 

혹시 아래 코드가 왜 1tab 들어가져있는지 알게 된다면 다시 글을 수정하겠다. 

완벽하지는 않지만 90%정도 정확한듯 !! 

 

https://wikidocs.net/32945

 

endswith()_ 접미사로 문장찾기

### 정의된 문자열이 지정된 접미사로 끝나면 True를 돌려주고, 그렇지 않으면 False를 돌려줍니다. 접미사는 찾고자 하는 접미사들의 튜플이 될 수 도 있습니다. 선택 ...

wikidocs.net

참고

 

남의 코드보다가 새로운거 배워서 적어놓는 꿀팁

 

string 뒤에 .endswith() 을 붙이면 접미사를 확인하고 bool을 return한다.

 

A = 'This is test String!'
A.endswith('!')
#True를 return

A.endswith('String!')
#True를 return

A.endswith('String')
#False를 return

+ Recent posts