2022.10.20 0345: 코드 주석 부분 오탈자 수정 (기능엔 문제 없음)
2022.10.20 0410: 본문 오탈자 수정

2022.10.20 0505: SSH 키 페어 생성 관련 내용 추가

2022.10.20 2220: TCP 및 SSH 액세스 관련 사전 설정 내용 추가

2022.10.21 0215: 에러 대응 섹션 추가

2022.10.22 1655: xFormers 설치 관련 코드 수정

2022.10.27 0510: 본문 오탈자 수정

2023.02.04 2335: xFormers 패키지 링크 수정

2023.02.05 0110: 최신 원클릭 노트북 실행 환경 대응 위한 내용 첨삭

2023.02.06 0200: 실행 환경 구성에 대한 내용 추가

2023.02.06 0300: 로그 출력 문제 대응 관련 내용 추가


2023.02.06 0300 내용 추가

난 이제 변화하는 원클릭 노트북에 대한 Runpod 상에서의 완전한 지원을 약속할 수 없음.

더 이상 SD를 통해 그림을 뽑는 것에 대한 흥미를 느끼지 못하기 때문에, AI그림챈에 자주 오지도 않을 듯 함.

따라서 지금 시간 이후로 발생하는 문제에 대한 트러블슈팅은 사용자 본인이 직접 해야 함.

달리 말하면, 이쪽의 지식이 없어서 자력으로 대응할 능력이 없는 사람들에게 권장하고 싶지 않음.

아마 AUTOMATIC1111의 WebUI는 계속 파이썬 3.10으로 갈 듯한 느낌이니,

Runpod가 템플릿을 잘 업데이트 한다는 가정 하에 이 가이드는 문제 없이 제 기능을 할 것이라고 예상됨.

Runpod는 유료 서비스이기 때문에 신중히 결정하길 바람.


==========================================


==[사전 알림]==

이 가이드는 RunPod Blog에 올라와 있는

Back Your Favorite Google Colab Notebooks with RunPod GPUs

를 기반하여 작성되었다.

한글로 풀어 씀과 동시에 원클릭 노트북 사용을 위한 추가 작업에 대한 안내도 겸한다.

====


원클릭 노트북을 이용한 Runpod.io 설정 가이드

이 글의 코랩 버전이다.

위 가이드에선 RunPod 상의 Jupyter Lab에서 직접 실행하는 형태를 취했지만,

이번엔 코랩 상에서 실행할 수 있게 하기 위해 RunPod의 런타임을 노트북과 연결할 것이다.

먼저 가입이나 결제에 관한 것은 위 가이드에서 다뤘기 때문에 생략하겠다.

아마 이렇게 하는 게 기존 방식보다 편할거?임


본 가이드는 다음과 같은 순서로 진행 될 것이다.

1. 코랩에서 RunPod의 런타임에 연결하기 위한 작업

2. 원클릭 노트북 사용을 위한 기본 설정

3. 실행 및 테스트



1. 코랩에서 RunPod의 런타임에 연결하기 위한 작업

Runpod는 구글에서 하라고 하는 대로 사전 작업을 해주면 연결이 가능하다.

하지만 잘 몰라서 터미널에 무작정 때려 넣으면 될 것도 안된다.


과정 진행 전 확인 사항이 2가지가 있다.

1. 만약 Community cloud를 사용할 경우 Browse Servers 메뉴에서 서버를 찾을 때

TCP 노출이 지원되는지 확인한다.

위처럼 TCP라는 글자가 HTTP 옆에 있으면 지원한다는 뜻이다.


2.포드 생성 시에 다음의 옵션이 체크 돼 있는지 확인하자.

사소한 것들이라 빼 먹을 가능성이 농후하기 때문에 주의가 요구된다.

## 템플릿은 PyTorch가 아니라 RunPod Stable DIffusion v1.5/v2.1 로 설정할 것!! ##


먼저 다음의 명령어를 복사하자.

bash -c 'pip install --upgrade jupyter_http_over_ws>=0.0.7;jupyter serverextension enable --py jupyter_http_over_ws; cd /; ./start.sh'


My Pods 메뉴에서 코랩과 연결할 포드를 하나 골라 Edit Job 메뉴로 들어간다.

Docker Command라고 되어있는 칸에 위 명령어를 붙여넣기 한다.

우하단의 Expose TCP Ports에 어떤 숫자도 없이 비어있을 것이다.

22, 를 입력하고 저장.

그리고 아래 Environment Variables 우측의 화살표를 눌러 추가 메뉴를 펼치자.


JUPYTER_PASSWORD의 우측의 value에 있는 비밀번호(토큰)를 메모해두자. 나중에 사용한다.

그리고 Save 버튼을 눌러 설정을 저장한다.

#주의 : 포드가 실행 중인 상황이라면 포드가 재시작 되니 작업 중이라면 작업물을 날리는 일이 없도록 하자.


이후에 코랩에서 포드로의 접속을 위한 공개/비밀 키 페어를 만들어 둘 필요가 있다.

Connect 버튼을 눌러서 Configure Public Key 클릭.


ssh-keygen~~~ 부분을 클릭하면 자동으로 복사가 된다.

"your~~@~~~.com" 부분을 사용하는 이메일로 바꾸고, 전체를 복사해서


cmd에 붙여넣고 실행하면 된다.

특히 저 중간의 passphrase는 보안에 관련한 부분인데,

일단은 비운 채로 진행해도 상관은 없다.

보안 상 문제가 우려되면 패스프레이즈를 제대로 설정하자.

아래에 Randomart Image 까지 뜨면 키 페어 생성 완료.


탐색기로 가서 경로 창에

%UserProfile%\.ssh

위 명령을 입력한다.

그럼 아래와 같이 키 파일들이 보일 것이다.

여기서 id_ed25519.pub 파일을 텍스트 에디터로 열고 그 내용을 복사한다.


다시 Runpod로 돌아와서 좌측 메뉴의 Settings로 간다.

SSH Public Key 부분에 복사한 내용을 붙여 넣고

Update Public Key 버튼을 클릭하면 완료.


이제 Connection Options로 가자.

여기서 주목해야 할 부분은

SSH over exposed TCP 아래의 ssh 연결 명령어 부분임.

저 부분을 일단 메모해 두자.

특히 빨간 박스가 쳐진 부분을 주의해야 하는데,

4094라는 숫자는 외부 데이터와 통신하는 포드의 포트임.

저 포트는 포드 실행 시에만 유효하고 재시작 할 때 마다 바뀌므로,

바뀐다는 사실을 잘 기억하자.


그리고 메모해둔 명령어 뒤에 [ -L 8888:localhost:8888]를 붙인다.

그러면 아래와 같은 형태가 됨.

ssh [email protected] -p 4094 -i ~/.ssh/id_ed25519 -L 8888:localhost:8888

최종적으론 이런 형태를 계속 메모해두고 쓰게 된다.

다른 포드를 사용하게 된다면 앞의 아이피도 바뀌니 그것도 주의.


그럼 위의 메모해 둔 명령어를 복사하고 cmd를 켜고,

명령어를 붙여 넣고 Enter.

그럼 저 빨간 박스가 쳐진 부분에서 막힐텐데 'yes'를 입력하면 다음으로 넘어갈 수 있다.

cmd에서 무조건 이 연결을 활성화 시켜줘야 코랩과 포드간의 통신이 가능해진다.

코랩과 연결전에 무조건 cmd에서 명령어 실행!

을 기억하자.


2. 원클릭 노트북 사용을 위한 기본 설정

앞이 참 길었다.

그래도 이젠 정말 별거 없으니 쫄지들 마시라.


노트북을 띄워서 개인에 맞게 설정하자.

난 이번에도 ngrok을 사용할 예정.


이제 런포드 런타임을 코랩에 연결해보자.

아까 우린 cmd에 명령어를 입력해서 코랩과 런포드 간의 연결다리를 만들었다.

조금 전에 메모해둔 비밀번호(토큰)을 이제 쓴다.

코랩에 접속하기 위해선 어떤 링크가 필요한데, 아래와 같은 모양새다.

http://localhost:8888/lab?token=51as1vrmd5ne4jmwjwha


token= 뒤에 있는 영문 모를 문자열들을 메모해둔 토큰으로 바꿔치기 하자.

저 토큰은 1포드-1토큰의 관계를 가진다.

포드마다 고유의 토큰이 있고 디플로이 한 포드를 계속 쓰는 이상 저 토큰은 변하지 않는다.

저 상태로 잘 메모해두자.


그럼 저 토큰을 복사하고 아래와 같이 따라한다.

저 입력 부분에 링크를 붙여넣기 하고 연결 버튼을 누르면 연결을 진행한다.

'연결됨(로컬)' 이 뜨면 성공.


3. 실행 및 테스트


추가적으로 설치할 라이브러리가 있다.

rsync를 사용하게 바뀌었기 때문에 이것을 설치해 주어야 한다.

코드 섹션을 추가한 후 아래의 코드를 붙여넣고 실행한다.

!apt-get update -y

!apt install -y aria2

!apt install -y rsync

!pip install ipywidgets==7.7.1


그리고 Connect > Start Web Terminal > Connect to Web Terminal 의 순서로 웹 터미널을 연다.

ps aux 입력

위의 3개의 프로세스가 보인다.

지금 사용하는 이미지는 실행 시 자동으로 WebUI를 실행 시키기 때문에 이들을 죽여줘야 한다

맨 오른쪽 칸을 주목하라.

프로세스의 커맨드를 잘 보고 저들을 죽여야 한다.

위 예시대로면 PID가 17, 31, 32기 때문에

"kill 17 31 32" 를 입력하여 처리할 수 있다.

꼭 해야한다!!


프로세스를 죽이고 난 후 꼭 Restart Pod를 통해 포드를 재시작 해야한다!!

재시작 하지 않으면 정상적으로 로그가 출력 되지 않는다!!

재시작 했기 때문에 SSH 연결도 끊기게 되니 다시 연결해 주어야 한다!!



다 끝난 것 같으면 제일 중요한 Web Ui를 실행하자.


잘된다. 짤도 잘 뽑힌다.

PROFIT!



#### 에러 대응 ####

1. [email protected]: Permission denied (publickey,password). 에러

위 에러가 발생 경우 시도해볼 수 있는 방법에 대해 소개한다.

이 에러는 일반적으로 .ssh 폴더에 있는 known_hosts 파일에 기록된 키와 .ssh 폴더에 있는 키가 상충할 때 일어난다. (다른 경우의 수도 있다.)

이 문제는 다음의 한 가지 방법으로 모든 경우의 수에 대응할 수 있다.


먼저 .ssh 폴더에 가서 known_hosts를 메모장 같은 텍스트 에디터로 열자.

그럼 위와 같이 알아먹을 수 없는 문자열들이 나온다.

보통의 사람들의 경우 ssh를 사용할 일이 없으므로 Runpod와 관련한 내용들만 있을 것이다.

Runpod와 관련한 내용들만 다 지우고 저장하거나, known_hosts 파일 자제를 삭제한다.

그럼 .ssh 폴더엔 다음의 두 파일만 덩그러니 있을 것이다.

없거나 패스프레이즈가 기억나지 않으면 키 페어를 새로 생성하고 오자.


이제 .pub 파일을 텍스트 에디터로 열고 내용을 복사해서

저기 붙여 넣고 Update Public Key 버튼을 클릭.

그런 다음 포드를 새로 뽑거나 재시작 해서 다시 ssh 접속을 시도해보자.


이러면 아래와 같이 ssh 프로그램이 known_hosts를 새로 생성하고 거기에 새로운 정보를 기록함으로써 접속에 성공한다.

대다수의 ssh에 대한 약간의 지식도 없는 사람들에겐 이 방법이 최고라고 생각한다.

ssh를 평소에 다루던 사람이면 자기만의 해결 방법으로 해결할 수 있지 않을까?


2. 런타임에 연결할 수 없습니다.

코랩에서 런포드의 런타임에 접속할 수 없는 문제다.

이 문제는 90% ssh 연결을 설정하지 않아서 벌어지는 문제다. ssh에 접속하면 해결.


남은 10%중의 절반은 포드의 Docker Command를 설정하지 않아서 일어나는 문제다.

위로 스크롤을 올려서 bash~~ 라고 적혀있는 곳으로 가서 Docker Command를 세팅하자.


나머지 절반은 접속용 토큰이 틀리기 때문에 일어나는 문제다.

JUPYTER_PASSWORD의 value와 지금 코랩에 입력되어 있는 값을 비교해서,

value의 토큰으로 연결을 시도할 수 있도록 하자.


=====================================


2023. 02. 05 0110시에 이 마무리 글을 작성


Runpod에 원클릭 노트북을 올리는 과정에서 일체의 노트북을 수정하는 일이 없고,

추가적으로 무언가를 설치하는 과정도 줄였다.


노트북을 건들지 않으니 노트북에 관한 질문은 받을 수도 없고 답을 할 수도 없다.

난 노트북을 작성한 사람이 아니기 때문.