원격 Docker 컨테이너 환경 VS code 개발환경 설정

HeungJun Kim·2024년 6월 18일
0

개발환경

목록 보기
8/8

개발용 도커 이미지 내려받기 & 컨테이너 생성

vi run_docker.sh

#!/bin/bash
IMAGE_NAME="nvcr.io/nvidia/pytorch:23.11-py3"
CONTAINER_NAME="khjgmdwns"
num=`docker ps -a|grep "$CONTAINER_NAME"|wc -l`
if [ 0 -eq $num ]; then
 set -x
 docker run --rm -it --net=host --privileged --name $CONTAINER_NAME \
 --ulimit core=-1 \
 --gpus all \
 -v /home/fssv3/workspace:/workspace \
 -v /home/fssv3/fssv3_datasets:/mnt/fssv3_datasets \
 $IMAGE_NAME

 set +x
else
 set -x
 docker start $CONTAINER_NAME
 docker attach $CONTAINER_NAME
 set +x
fi

  • 위의 쉘 스크립트는 CONTAINER_NAME이 "khjgmdwns" 인 컨테이너를 찾고,
    해당 컨테이너가 없을 경우 "nvcr.io/nvidia/pytorch:23.11-py3" 라는 이름의 도커 이미지로부터 컨테이너를 새로 생성한다.
    (만약, 도커 이미지가 없으면 nvidia 도커 허브에서 자동으로 다운받는다.)

  • 도커 컨테이너가 존재하는 경우 해당 컨테이너에 접속한다.

  • VS Code에서 원격 컨테이너에 연결하여 작업하려면 컨테이너는 항상 활성화 상태 여야만 한다.
    따라서 docker 컨테이너를 마치고 종료할때는,
    반드시 "Ctrl + c" / "Ctrl + d" 가 아닌 !!!!
    "Ctrl+p+q"로 종료해야 한다.

  • 접속중인 도커 컨테이너 환경에서 Ctrl + p + q 로 나가면,
    아래와 같이 컨테이너는 계속 유지된다.

    docker ps

  • 이렇게 컨테이너를 유지할 수 있으면 원격 SSH를 통한 딥러닝 모델 학습 작업 중에 터미널이 종료되거나, 네트워크가 불안정하더라도 학습에 문제가 없다.

  • 만약 NGC 초기 이미지로 생성한 컨테이너 사용중에,
    apt install / conda 환경 / pip install 을 통한 파이썬 패키지 등 설치 항목이 많다면 주기적으로 컨테이너 변경사항을 docker 이미지에 commit 해주면 좋다.

vi run_commit.sh

#!/bin/bash
IMAGE_NAME="khjgmdwns"
CONTAINER_NAME="khjgmdwns"

# 현재 실행 중인 컨테이너 목록 확인
docker ps

# 컨테이너 ID를 사용하여 이미지로 커밋
docker commit $CONTAINER_NAME $IMAGE_NAME

# 커밋된 이미지 확인
docker images

Visual Studio Code 원격 서버 연결

1. 확장프로그램 설치

(1) Ctrl + Shift + x
(2) 다음 프로그램 설치

  • Remote - SSH
  • C/C++ Extension Pack
  • Dev Containers
  • IntelliCode
  • Python Extension Pack

2. 원격 서버 SSH 연결

(1) [F1] 버튼을 누르고 "Remote-SSH: 호스트에 연결" 선택

(2) "SSH 호스트 구성..." 선택

(3) 호스트 및 원격 계정 추가

혹은, Remote - SSH 확장 설치 후에 좌측에 생기는 [원격 탐색기] 버튼을 누르고 설정해도 된다.

3. 원격 컨테이너에 연결

  • VS code에서 원격 서버에 SSH 연결 후,
    원격 탐색기 탭에서 [개발 컨테이너]에 연결할 수 있다.
    (Dev Containers 확장 설치 필요!)

  • 개발 컨테이너 목록에서 연결하려는 컨테이너를 선택하여 접속한다.
    (처음 연결 시에는 기타 컨테이너 목록에 있고, 연결 이후에는 개발 컨테이너 목록에 나타난다.)

  • 컨테이너에 접속하면 docker 이미지 정보와 마운트된 디렉토리 확인이 가능하다.

4. 컨테이너 내의 프로젝트 환경에서 작업하기

CFLAGS := -std=c++11 -I$(SRCDIR) -I/usr/local/cuda/include $(shell pkg-config --cflags opencv4)

위와 같이 Makefile에 OpenCV 와 TensorRT 라이브러리의 헤더를 추가해주고, 성공적으로 빌드가 되더라도 VS code에서는 헤더를 찾을 수 없기 때문에 자동완성 기능을 사용할 수 없고 빨간색 밑줄이 생긴다.


빠른 수정을 선택하고
"IncludePath"에 설정 편집을 선택한다.

  • 이 과정은 VS Code 상에서 Docker Contaner 내부의 라이브러리 헤더 위치를 모르기 때문에 별도로 추가해주는 과정이다.

예를 들어 아래와 같이 "NvInfer.h" 헤더를 찾지 못하는 경우에는

터미널(컨테이너 접속환경)에서 해당 해더의 위치를 탐색하고,
찾아진 헤더 경로를 "IncludePath"에 추가해준다.

gdb 및 디버깅(중단점) 설정

  • VS code 상에서 gui 로 실행 버튼 혹은 [F5] 키로 원격 컨테이너 내의 프로젝트를 빌드하는 것이 목표이다.

  • 이를 위해서는 3가지 설정 파일을 작성해야한다.

c_cpp_properties.json : vs code 에서 참조, 자동완성과 같은 IntelliCode 를 연동하기 위함
task.json : gdb를 통해 디버거를 실행할(?) 옵션
launch.json : 실행(Release mode)/디버깅(Debug mode) 등 런처를 어떤 실행 프로그램과 연결시킬지
(실행 버튼이 어떤 동작을 할지)

  • 여기서 task.json을 프로젝트의 Makefile 에 의한 make 를 수행하도록 연결할 수 있다고는 하는데, 나는 실패했다.
  • 시행 착오 끝에 "args"의 -g 옵션에 -I헤더 -o타겟 -L라이브러리 형식으로 직접 등록해줘야만 했다...
    (Make 파일과 유사하게 그대로 작성)
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++ 활성 파일 빌드",
            "command": "/usr/bin/bash",
            "args": [
                "-c",
                "/usr/bin/g++ -fdiagnostics-color=always -g ${workspaceFolder}/src/main.cpp ${workspaceFolder}/src/trt_engine.cpp -I${workspaceFolder}/src -I/usr/local/cuda/include -I/usr/include/x86_64-linux-gnu -o ${workspaceFolder}/bin/${fileBasenameNoExtension} -L/usr/local/cuda/lib64 -lcudart -lnvinfer -lnvinfer_plugin -lnvonnxparser $(pkg-config --cflags --libs opencv4)"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "디버거에서 생성된 작업입니다."
        }
    ]
}

그 결과... 힘겹게 성공했다!!!!


중단점이 정상적으로 동작하고 조사식을 통해서 지역변수의 값을 확인할 수 있다!

이렇게 도커 컨테이너 환경의 c++ 프로젝트를 VS code 내에서 빌드하고 중단점을 찍어 디버깅하는 것이 가능하다.

python 디버깅 설정

  • python은 간단하게 ▶ 버튼을 누르고 파이썬 인터프린터의 경로를 설정해주면 된다.(Conda 사용 시 Env 경로의 인터프린터로 설정)

profile
Computer Vision / ADAS / DMS / Face Recognition

0개의 댓글