연산 세션에 SSH/SFTP 접속하기 (Linux/Mac/Visual Studio Code)

Backend.AI는 생성된 연산 세션(컨테이너)에 SSH/SFTP 접속을 지원하고 있습니다. 이번 절에서는 그 방법에 관해 알아봅니다.

참고

24.03 버전부터 연산세션에 SSH/sFTP 접속하는 기능을 웹 기반 Web UI와 데스크탑 앱에서 모두 지원합니다.현재 버전이 23.09 이거나 그 이전 버전일 경우, 데스크탑 앱에서만 해당 기능을 지원합니다.데스크탑 앱은 Summary 페이지의 별도 다운로드 패널에서 다운로드할 수 있습니다. 이 패널에서 다운로드하는 경우에는 호환 버전을 자동으로 다운로드 합니다.

../_images/app_download_panel.png

데스크탑 앱은 https://github.com/lablup/backend.ai-webui/releases 에서도 수동 다운로드 할 수 있습니다. 이 경우에는 Backend.AI 클러스터 서버 버전과 호환되는 Web-UI 앱을 받아야 최상의 호환성을 유지할 수 있습니다. Backend.AI 클러스터의 버전은 GUI 우측 상단에 있는 설정 아이콘을 클릭하면 나오는 “About Backend.AI” 메뉴를 클릭하여 확인할 수 있습니다.

Linux / Mac 환경

먼저 연산 세션을 하나 생성한 후 Control의 앱 아이콘(첫 번째 버튼)을 클릭하고 SSH / SFTP 아이콘을 클릭합니다. 그러면 해당 컨테이너 내부에서 SSH/SFTP 접속을 할 수 있도록 해주는 데몬(demon)이 뜨게 되고, 로컬 proxy를 통해 Web-UI 앱과 컨테이너 내부의 데몬이 연결됩니다.

경고

이 아이콘을 클릭하기 전에는 해당 세션에 SSH/SFTP 접속을 할 수가 없습니다. 만약, Web-UI 앱을 껐다가 다시 켜게 되면 로컬 proxy와 Web-UI 앱 사이의 연결이 초기화 되므로 SSH/SFTP 아이콘을 다시 한 번 클릭해주어야 합니다.

이어 SSH/SFTP connection 정보를 담고 있는 다이얼로그가 뜨는데, SSH URL에 적힌 접속 주소(특히 할당 받은 포트)를 기억한 뒤 id_container 파일 다운로드 링크를 클릭하여 로컬 머신에 받아 둡니다. 이 파일은 자동으로 생성된 SSH private key입니다. 링크를 통해 다운로드하는 대신 터미널 또는 Jupyter Notebook으로 /home/work/ 하위에 위치하고 있는 id_container 파일을 다운로드 할 수도 있습니다. 자동 생성된 SSH key는 세션이 새로 생성될 때마다 변할 수도 있는데, 이럴 경우 다시 다운로드 받아야 합니다.

SSH/SFTP 데몬을 연산 세션(컨테이너) 내부에서 시작하기

다운로드 받은 SSH private key로 연산 세션에 SSH 접속을 하려면 쉘 환경에서 다음과 같은 명령을 내릴 수 있습니다. 이 때 -i 옵션에 다운로드 받은 id_container 파일의 위치를, -p 옵션에 연산 세션이 할당 받은 포트 번호를 적어주어야 합니다. 연산 세션 내의 사용자는 보통 work 로 설정되는데, 만약 work 가 아닌 다른 계정을 사용하는 경우라면 work@127.0.0.1 에서 work 부분을 실제 접속되는 계정으로 바꾸어 주어야 합니다. 정상적으로 명령을 내렸다면 연산 세션에 SSH 접속이 이루어지고 컨테이너 내부의 쉘 환경에 접속되는 것을 확인할 수 있습니다.

$ ssh
>     -i ~/.ssh/id_container -P 30722 \
>     -o StrictHostKeyChecking=no \
>     -o UserKnownHostsFile=/dev/null \
>     work@127.0.0.1
Warning: Permanently added '[127.0.0.1]:30722' (RSA) to the list of known hosts.
f310e8dbce83:~$

SFTP 접속을 하는 방법도 거의 같습니다. SFTP 클라이언트를 실행하고 public key 기반의 접속 설정을 한 후 id_container 를 SSH private key로 지정하면 됩니다. FTP 클라이언트 별로 사용 방법은 상이할 수 있으므로, 자세한 방법은 각 FTP 클라이언트 매뉴얼을 참고 하십시오.

참고

SSH/SFTP 접속 포트 번호는 연산 세션을 생성할 때마다 임의의 값이 할당됩니다. 만약, SSH/SFTP 접속 포트를 특정한 값으로 고정하고 싶다면, 사용자 설정 메뉴에서 “Preferred SSH Port” 항목에 포트 번호를 기입할 수 있습니다. 세션 내의 다른 서비스와의 충돌을 가능한 방지하기 위해 포트 번호는 10000-65000 사이의 값을 지정하는 것을 권장합니다. 다만, 두 개 이상의 연산 세션에서 동시에 SSH/SFTP 연결을 맺게되는 경우, 두 번째 SSH/SFTP 연결은 지정된 포트를 사용할 수 없으므로 (첫 번째 SSH/SFTP 연결이 이미 점유) 임의의 포트 번호를 할당받게 됩니다.

참고

만약 id_container 대신 사용자 자신의 SSH keypair를 사용하고 싶다면, .ssh 라는 이름의 사용자 폴더를 하나 만듭니다. 그 폴더 안에 authorized_keys 파일을 만든 후 사용할 SSH public key를 파일 내용으로 추가하면, 연산 세션 생성 후 id_container 파일을 다운로드 할 필요없이 자신의 SSH private key를 통해 SSH/SFTP 접속할 수 있습니다.

참고

만약 다음과 같은 경고 메시지가 뜨면, id_container 의 권한을 600으로 설정한 후 재시도 합니다. (chmod 600 <id_container 경로>)

Permissions Warning Message

Windows / FileZilla 사용 환경

Backend.AI Web-UI 앱에서 지원하는 SSH/SFTP 접속 방법은 OpenSSH 기반 public key 접속(RSA2048)입니다. 윈도우즈의 PuTTY 등 클라이언트를 통해 접속하려면 PuTTYgen 등과 같은 프로그램으로 SSH private key를 ppk 파일로 변환하는 작업이 추가로 합니다. 변환 방법은 다음 링크를 참조 할 수 있습니다: https://wiki.filezilla-project.org/Howto. 보다 쉬운 설명을 위해 이번 절에서는 Windows에서 FileZilla 클라이언트를 통해 SFTP 접속하는 방법에 관해 알아보겠습니다.

Linux/Mac에서의 접속 방법을 참고하여 연산 세션을 생성하고 접속 포트 확인과 id_container 다운로드를 수행합니다. id_container 는 OpenSSH 기반의 키이므로, 윈도우 또는 ppk 형태의 키만 지원하는 클라이언트를 사용할 경우 변환을 해야 합니다. 여기서는 PuTTY와 함께 설치되는 PuTTYgen 프로그램을 통해 변환을 해보겠습니다. PuTTYgen 프로그램을 실행한 후 Conversions 메뉴의 import key를 클릭합니다. 이어 뜨는 파일 선택 다이얼로그에서 다운로드 한 id_container 파일을 선택합니다. PuTTYGen의 Save private key 버튼을 클릭하여 id_container.ppk 라는 이름으로 파일을 저장합시다.

SSH key conversion with PuttyGen

이제 FileZilla 클라이언트 앱을 실행한 후 설정-연결-SFTP 페이지로 들어가 생성한 id_container.ppk (OpenSSH를 지원하는 클라이언트의 경우 id_container) 키 파일을 등록해 줍니다.

연산 세션에 접속하기 위한 Filezilla 설정

사이트 관리자를 열고 새 사이트를 하나 만든 후 다음과 같이 접속 정보를 적어 줍니다.

Filezilla site setting

해당 컨테이너에 처음 접속하는 경우 다음과 같은 확인 창이 뜰 수 있습니다. 확인 버튼을 눌러 호스트 키를 저장합시다.

Unknown Host Key dialog

잠시 기다린 후 다음과 같이 접속이 되는 것을 확인할 수 있습니다. SFTP 접속을 통해 /home/work/ 및 마운트 된 Storage 폴더에 대용량 파일을 전송하는 등의 작업을 수행할 수 있습니다.

Filezilla connection established

For Visual Studio Code

로컬 Visual Studio Code에서 SSH/SFTP를 통해 Backend.AI 연산 세션에 접속하여 원격 개발할 수도 있습니다. 한번 연결을 하면, 연산 세션 상에 존재하는 모든 파일과 폴더를 활용하여 작업할 수 있습니다. 이번 절에서는 그 방법에 관해 알아봅니다.

우선, Visual Studio Code와 원격 개발(Remote Development) 확장팩을 설치해야합니다.

링크: https://aka.ms/vscode-remote/download/extension

Install remote ssh plugin on Visual Studio Code

확장팩 설치 후 연산 세션 접속을 위한 SSH 연결 설정을 진행합니다. SSH/SFTP 다이얼로그에서 “DOWNLOAD SSH KEY” 버튼을 클릭하여 연산 세션에 접속하기 위한 SSH 비밀키를 다운로드 합니다. 포트 번호도 기억해 두십시오.

Download SSH Key

다음으로 SSH 설정 파일을 수정합니다. ~/.ssh/config 파일(Linux/Mac) 또는 C:\Users\[user name]\.ssh/config (Windows) 파일을 텍스트 편집기로 열고 다음 블록을 추가합니다. 편의를 위해 호스트 이름을 vscode 로 설정했지만, 이는 원하는 대로 바꾸셔도 됩니다.

Host vscode
  HostName 127.0.0.1
  Port 30722  # write down the port number that you remembered
  User work
  ForwardAgent yes
  StrictHostKeyChecking no
  IdentityFile path/to/downloaded/id_container

이제 Visual Studio Code의 View - Command Palette… 메뉴를 선택합니다.

View > comma

Visual Studio Code는 연결할 호스트의 타입을 자동으로 탐지합니다. Remote-SSH: Connect to Host… 를 선택해봅시다.

SSH connect

여기서는 .ssh/config 의 호스트 목록을 볼 수 있습니다. 연결할 호스트(vscode)를 선택합니다.

Select remote ssh select Host

연결이 된 후 빈 창이 표시됩니다. 상태 표시 줄을 참조하면 연결된 호스트를 확인할 수 있습니다. 연결이 된 후 빈 창이 표시됩니다. 상태 표시 줄을 참조하면 연결된 호스트를 확인할 수 있습니다.

Finished remote ssh connection

로컬에서와 마찬가지로 파일 > 열기… 또는 파일 > 워크스페이스 열기… 메뉴를 통해 원격 호스트에서 폴더나 워크스페이스를 열 수 있습니다!

open remote host file directory

Backend.AI Client 패키지를 통해 SSH 접속하는 방법

이 문서에서는 GUI 환경 사용이 불가능한 곳에서 연산 세션으로 SSH를 접속하는 방법에 관해 설명합니다.

일반적으로 연산 세션이 생성된 GPU 노드는 외부에서 직접 접속이 불가능합니다. 따라서 연산 세션에 SSH 또는 sFTP 접속을 하기 위해서는 사용자 머신과 GPU 노드에 생성된 연산 세션 사이의 터널을 중계하는 로컬 프록시가 필요합니다. Backend.AI Client 패키지를 활용하면 이 과정을 비교적 간단하게 설정할 수 있습니다.

Backend.AI Client 패키지 사용 환경 구성

Docker image를 이용한 구성

Backend.AI Client 패키지를 도커 이미지로 다운로드할 수 있습니다. 다음 명령을 실행하여 Docker Hub에서 이미지를 다운로드할 수 있습니다:

$ docker pull lablup/backend.ai-client
$
$ # If you want to use the specific version, you can pull the image with the following command:
$ docker pull lablup/backend.ai-client:<version>

Backend.AI 서버 버전은 Web UI의 우상단 사람 아이콘을 클릭하면 나오는 “Backend.AI에 대하여”에서 확인할 수 있습니다.

../_images/check_backend_server_version.png

다운 받은 이미지를 다음 명령으로 실행합니다.

$ docker run --rm -it lablup/backend.ai-client bash

backend.ai 명령이 존재하는지 확인합니다. 정상적으로 진행되었다면 도움말이 출력됩니다.

$ backend.ai

Python 가상환경을 통해 호스트에서 사용 환경 구성하기

Docker를 사용할 수 없거나 사용하고 싶지 않다면, 호스트 머신에 Backend.AI Client 패키지를 직접 설치할 수도 있습니다. 사전 요구 사항은 다음과 같습니다:

  • Python 버전은 Backend.AI Client 버전에 따라 바뀝니다. https://github.com/lablup/backend.ai#python-version-compatibility 페이지에서 호환 매트릭스를 확일할 수 있습니다.

  • clang 컴파일러 설치가 필요할 수 있습니다

  • indygred Python 바이너리를 사용하는 경우 zstd 패키지를 미리 설치해야합니다.

Client 패키지 설치를 위해 별도의 Python 가상 환경 사용을 권장합니다. 한 가지 방법은 indygreg 저장소에 있는 정적 빌드된 Python 바이너리를 사용하는 것입니다. 다음 사이트에서 Client 패키지를 설치할 머신 아키텍처에 맞는 Python 바이너리를 다운로드한 후 압축을 해제합니다.

  • https://github.com/indygreg/python-build-standalone/releases

  • 대중적으로 많이 사용되는 x86 기반 Ubuntu 환경이라면 다음과 같이 다운로드 할 수 있습니다:

    $ wget https://github.com/indygreg/python-build-standalone/releases/download/20240224/cpython-3.11.8+20240224-x86_64-unknown-linux-gnu-pgo-full.tar.zst
    $ tar -I unzstd -xvf *.tar.zst
    

압축을 풀면 현재 디렉토리 하위에 python 디렉토리가 생길 것입니다. 다음 명령을 실행하여 다운로드 한 파이썬의 버전을 확인할 수 있습니다.

$ ./python/install/bin/python3 -V
Python 3.11.8

시스템의 다른 파이썬 환경에 영향을 주지 않기 위해 사용자 머신에 독립적인 Python 3.10 가상 환경을 생성합니다. 다음 명령 실행 시 .venv 디렉토리에 Python 가상 환경이 생성됩니다.

$ ./python/install/bin/python3 -m venv .venv

생성한 Python 가상환경을 활성화 합니다. 새로운 가상 환경을 활성화한 것이므로, pip list 명령 실행 시 pipsetuptools 패키지만 설치되어 있을 것입니다.

$ source .venv/bin/activate
(.venv) $ pip list
Package    Version
---------- -------
pip        24.0
setuptools 65.5.0

Backend.AI Client 패키지를 설치합니다. 서버팜에 설치된 서버 버전에 맞추어 클라이언트 패키지를 설치합니다. 여기서는 23.09 버전이라고 가정합니다. 만약, netifaces 라는 패키지 설치 관련 오류가 발생하는 경우, pipsetuptools 의 버전을 낮추어야할 수도 있습니다.

(.venv) $ pip install -U pip==24.0 && pip install -U setuptools==65.5.0
(.venv) $ pip install -U backend.ai-client~=23.09
(.venv) $ backend.ai

CLI 클라이언트에서 서버 접속 설정

.env 파일을 만들고 다음과 같이 내용을 추가합니다. webserver-url 에는 브라우저에서 Web UI 서비스로 접속할 때 사용하는 주소를 동일하게 씁니다.

BACKEND_ENDPOINT_TYPE=session
BACKEND_ENDPOINT=<webserver-url>

다음 CLI 명령을 실행하여 서버에 연결합니다. 브라우저에서 로그인할 때 사용하는 이메일과 비밀번호를 입력합니다. 정상적으로 실행된 경우 Login succeeded. 메시지가 뜹니다.

$ backend.ai login
User ID: myuser@test.com
Password:
✓ Login succeeded.

연산 세션에 SSH/SCP 접속

브라우저에서 데이터를 복사할 폴더를 마운트 한 후 연산 세션을 생성합니다. CLI로도 생성 가능하지만 편의를 위해 브라우저에서 생성한다고 하겠습니다. 생성된 연산 세션의 이름을 알아둡니다. 여기서는 ibnFmWim-session 라고 가정합니다.

단순히 SSH 접속을 하고자 하는 경우에는 다음과 같은 명령을 실행하면 됩니다.

$ backend.ai ssh ibnFmWim-session
∙ running a temporary sshd proxy at localhost:9922 ...
work@main1[ibnFmWim-session]:~$

SSH 키 파일을 받아 ssh 명령을 명시적으로 실행하고자 하는 경우에는 먼저 다음과 같은 명령을 실행하여 로컬 머신에서 연산 세션으로 접속을 중계하는 로컬 프록시 서비스를 띄워야 합니다. -b 옵션으로 로컬 머신에서 사용할 포트(9922)를 지정할 수 있습니다.

$ backend.ai app ibnFmWim-session sshd -b 9922 A local proxy to the application "sshd" provided by the session "ibnFmWim-session" is available at:
  tcp://127.0.0.1:9922

로컬 머신에서 다른 터미널 창을 띄웁니다. .env 파일이 있는 작업 디렉토리로 이동한 후 연산 세션에서 자동 생성된 SSH 키를 다운로드 합니다.

$ source .venv/bin/activate  # Reactivate the Python virtual environment as this is a different terminal
$ backend.ai session download ibnFmWim-session id_container
Downloading files: 3.58kbytes [00:00, 352kbytes/s] Downloaded to /*/client.

다운로드 한 키를 이용해서 SSH 접속을 다음과 같이 할 수 있습니다. 9922번에 로컬 프록시 포트를 띄웠으므로 접속 주소는 127.0.0.1, 포트는 9922 를 지정해야 합니다. 접속 사용자 계정은 work 로 사용하십시오.

$ ssh \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    -i ./id_container \
    -p 9922 \
    work@127.0.0.1
Warning: Permanently added '[127.0.0.1]:9922' (RSA) to the list of known hosts.
work@

마찬가지로 scp 명령을 사용하여 파일을 복사할 수 있습니다. 이 때, 연산 세션 내 마운트 된 폴더로 파일을 복사해야 연산 세션이 종료되었을 때에도 파일을 보존할 수 있습니다.

$ scp \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    -i ./id_container \
    -P 9922 \
    test_file.xlsx work@127.0.0.1:/home/work/myfolder/
Warning: Permanently added '[127.0.0.1]:9922' (RSA) to the list of known hosts.
test_file.xlsx

모든 작업이 끝난 경우에는 첫 번째 터미널에서 Ctrl-C 를 눌러 로컬 프록시 서비스를 종료합니다.