본문 바로가기
머신러닝

004. Nemo Docker에 띄우기

by 황금들보 2025. 9. 22.

0. ubuntu root에서 conda 설치

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p ~/miniconda3
echo 'export PATH="$HOME/miniconda3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda --version
# 서비스 사용 등록
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

 
1. conda로 독립 환경 만들

conda create -n Nemo_env python=3.11 -y
conda activate Nemo_env
python --version # Python 3.11.x 확인

 
2. conda 독립(가상) 환경에서 cudatoolkit 설치 (12.1)

conda install cudatoolkit=12.1 -c nvidia
conda config --add channels conda-forge # 두 채널 모두 12.1은 없다고 나와서 보니
conda search cudatoolkit -c conda-forge  # 11.8까지 지원한다고 나옴
# nvidia-smi 드라이버 버전이 낮으면 이럴 수 있다는데 난 아님. 높아
# 대안으로 토치를 설치하며, 설치하는 방법이 있데
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
# 아래로 확인하고
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

 
Docker CE를 리눅스에서 설치하라는데, 난 windows 용 docker desktop 이 있다고 하니, 우선 그냥 이걸루 해보자고 함
 
3. NVIDIA Container Toolkit for WSL 2: Ubuntu에서 NVIDIA Container Toolkit 설치 (GPU 지원)

sudo apt-get update
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/ubuntu22.04/libnvidia-container.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

# NVIDIA Container Toolkit을 통해 Docker가 NVIDIA GPU를 지원하도록 설정하는 명령어입니다. 이는 NVIDIA Riva와 같은 GPU 기반 애플리케이션을 Docker 컨테이너로 실행할 때 필수적입니다. 특히, Riva의 NGC 컨테이너(예: nvcr.io/nvidia/riva:2.15.0)를 실행하려면 Docker가 GPU에 접근할 수 있어야 하며, 이 설정이 이를 가능하게 합니다.
sudo nvidia-ctk runtime configure --runtime=docker 
INFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.

sudo systemctl restart docker                                   # 이거 대신 windows 용 도커 재실행하자
# 자 이제 GPU 정상적으로 사용하는지 확인해보자
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

# 퍼미션이 없다고 나오는구만 ㅜㅜ .  지금 내 아이디가 docker에 접근할 권한이 없데. 그래서 권한 설정
sudo usermod -aG docker $USER

newgrp docker

sudo reboot #ubuntu 종료 -> 재 시작해야 함

groups

#출력에 docker가 포함되어야 합니다(예: 내아이디 adm cdrom sudo dip plugdev lpadmin sambashare docker

# 자 다시,,  GPU 정상적으로 사용하는지 확인해보자
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

Unable to find image 'nvidia/cuda:12.1-base-ubuntu22.04' locally
docker: error getting credentials - err: fork/exec /usr/bin/docker-credential-desktop.exe

# 두가지 문제가 발생함
1.
크리덴셜 헬퍼 비활성화

mkdir -p ~/.docker
nano ~/.docker/config.json
안에 내용을

{
    "credsStore": ""
} # null로 변경
2.
NVIDIA CUDA 이미지 다운로드
docker pull nvidia/cuda:12.1.0-base-ubuntu22.04

오케이 이제 잘 된다

 
4. NGC 계정 생성 및 API 키 설정, NGC CLI 설치

  • NVIDIA NGC에 가입: https://ngc.nvidia.com/signup.
  • API 키 생성: NGC 대시보드 > Setup > Get API Key (키 복사).
  • 키 설정: 터미널에서 실행
docker login nvcr.io
Username: $oauthtoken
Password: < Api key>
ngc config set # API 키 입력

 
여기서, 난 ngc 가 설치되어 있지 않다고 나왔어. 그래서, => 아무리 아래 해도 안됨.
아래 작업 하지말고 5번으로 넘어가
#########################################################################

wget https://ngc.nvidia.com/downloads/ngccli_linux.zip
unzip ngccli_linux.zip
chmod +x ngc-cli/ngc
sudo mv ngc-cli/ngc /usr/local/bin/ngc  # /usr/local/bin/ngc로 이동해 시스템 전역에서 실행 가능.

#이제 잘 설치가 되었는지 확인해보자
ngc --version
[1860] Error loading Python lib '/usr/local/bin/libpython3.11.so.1.0':

# 파일이 없다고 나옴. 그래서 파일이 있어야 할 위치에서 찾아봄

sudo find /usr -name libpython3.11.so*
find ~/miniconda3/envs/Nemo_env -name libpython3.11.so*
/home/beomtec/miniconda3/envs/Nemo_env/lib/libpython3.11.so /home/beomtec/miniconda3/envs/Nemo_env/lib/libpython3.11.so.1.0
# 전체 리눅스 시스템에는 없고, 가상 환경에 설치되어 있음을 확인함.
# 이제 그럼 저 파일에 접근하도록 설정을 변경해줘야 함.
sudo ln -s /home/beomtec/miniconda3/envs/Nemo_env/lib/libpython3.11.so.1.0 /usr/local/bin/libpython3.11.so.1.0

# 아무리 해도 안됨. 삭제하고 다른 버전 깔기
# ngc 실행 파일 삭제
sudo rm -f /usr/local/bin/ngc
# 설치 폴더 삭제 (압축 풀었던 ngc-cli 폴더)
rm -rf ~/ngc-cli
rm -f ~/ngccli_linux.zip
rm ngc-cli.md5
#########################################################################

 
5. NGC CLI 설치 재시도
https://org.ngc.nvidia.com/setup/installers/cli
여기로 가서 내 환경에 맞는 프로그램 설치를 해봤어

wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/versions/4.3.0/files/ngccli_linux.zip -O ngccli_linux.zip && unzip ngccli_linux.zip

# 다운로드 파일 정상인지 확인
find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5
sha256sum ngccli_linux.zip

# 모드 변경 및 환경에 경로 등록
chmod u+x ngc-cli/ngc
echo "export PATH=\"\$PATH:$(pwd)/ngc-cli\"" >> ~/.bash_profile && source ~/.bash_profile


# 설정 : 있는 목록 중 선택만 하면 됨. ascii 선택, 나머지는 한 항목만 있어서 그것 선택
ngc config set


ngc --version
NGC CLI 4.3.0
와~. 이거 나오게 하려고 하루 걸림

 
6. Nemo Framework 설치 (최신 NeMo 컨테이너를 다운로드)
https://docs.nvidia.com/nemo-framework/user-guide/24.09/installation.html?utm_source=chatgpt.com 참조
버전은 계속 갱신되고 있는 듯.

docker pull nvcr.io/nvidia/nemo:24.09 # 시간이 좀 걸림. 파일이 큰 듯
docker run --gpus all -it --rm nvcr.io/nvidia/nemo:24.09 # docker에서 GPU를 활용하여  실행

 
7. Riva Quick Start 다운로드 및 초기화
버전은 계속 갱신되고 있는 듯.

mkdir ~/riva_quickstart && cd ~/riva_quickstart
ngc registry resource download-version "nvidia/riva/riva_quickstart:2.19.0"
cd riva_quickstart_v2.19.0
# 있어야 하는 주요 파일
config.sh: 설정 파일 (모델 경로, 서비스 활성화 등).
riva_init.sh: 모델 다운로드 및 초기화 스크립트.
riva_start.sh: Riva 서버 시작 스크립트.
riva_stop.sh: Riva 서버 종료 스크립트.

# 편집
nano config.sh
riva_model_loc="/home/beomtec/riva/models"
riva_ngc_org="nvidia"
riva_ngc_team="riva"
asr_enabled=true
tts_enabled=true # 원하면 사용해도 되는거임

# 한국어 언어 코드 설정 (ko-KR)
asr_language_code="ko-KR"



#해당 디렉토리 생성
mkdir -p /home/beomtec/riva/models

# Riva 초기화 : 위에서 enable한 모델들을 다운로드하고 초기화 진행 : 시간이 좀 걸림
bash riva_init.sh

# 런 테스트
bash riva_start.sh
bash riva_stop.sh

# 실행 결과 로그
beomtec@DESKTOP-AOND6GJ:~/riva_quickstart/riva_quickstart_v2.19.0$ docker ps | grep riva 9a5fda45d0f5 nvcr.io/nvidia/riva/riva-speech:2.19.0 "/opt/nvidia/nvidia_…" 54 seconds ago Up 54 seconds 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp, 0.0.0.0:50051->50051/tcp, [::]:50051->50051/tcp, 0.0.0.0:49195->8000/tcp, [::]:49195->8000/tcp, 0.0.0.0:49193->8001/tcp, [::]:49193->8001/tcp, 0.0.0.0:49194->8002/tcp, [::]:49194->8002/tcp riva-speech

주요 기능 (Riva 2.19.0 릴리스 기준): ASR (Automatic Speech Recognition): 음성을 텍스트로 변환. Whisper, Parakeet-RNNT, Distil-Whisper 등 모델 지원. 스트리밍 모드에서 화자 구분(speaker diarization) 기능 추가 (Sortformer 모델 사용). TTS (Text-to-Speech): 텍스트를 자연스러운 음성으로 합성. Magpie-TTS 아키텍처를 사용한 다국어 음성 합성 지원 (영어, 만다린 등). Zero Shot 음성 합성 (오디오 프롬프트 사용) 및 Neural G2P (Out-of-Vocabulary 단어 처리) 기능 포함. NMT (Neural Machine Translation): 실시간 번역 지원. 기타: NLP (자연어 처리) 추론, Automatic Speech Translation (AST) 지원. Blackwell GPU 아키텍처 호환.

포트 매핑 (출력에서 확인됨):
50051/tcp: gRPC 포트 (Riva 서버 API, 클라이언트 연결용).
50000/tcp: 추가 gRPC 또는 HTTP 포트 (일부 서비스용).
8000/tcp, 8001/tcp, 8002/tcp: Triton Inference Server의 HTTP 포트 (모델 서빙, 메트릭스, 로그 등).

여기까지 해서 서버 올리는데 이미 8G 메모리가 사용되어 문제가 있음. 아래 클라이언트 시작은 gpu가 필요하므로 더 문제됨
c#을 이용하여 gRPC 클라이언트를 구현하면 추가 GPU 사용하지 않고, wav 파일 전달로면 작동 가능하다고 함.
 
8. 사용하기 : riva_start_client
서버가 켜진 상태에서 클라이언트 컨테이너를 띄워 테스트합니다. (Embedded 환경이라면 서버 컨테이너 안에서 직접 테스트 가능)

  • 클라이언트 시작:
    text
    bash riva_start_client.sh
  • 설명: 이 명령어로 클라이언트 Docker가 시작되고, riva_asr_client 도구가 사용할 수 있게 돼요. 새 터미널에서 클라이언트 컨테이너에 들어가려면 docker exec -it <client_container_id> bash 사용.
  • 사용 가능한 모델 확인:
    text
    # 오프라인 ASR 모델 목록
    riva_asr_client --list_models
    
    # 스트리밍 ASR 모델 목록 (실시간용)
    riva_streaming_asr_client --list_models
    • 한국어 모델 (예: stt_ko_kr_conformer-ctc)이 목록에 있어야 해요.
  • ASR 테스트 (오프라인 모드):
    • 한국어 WAV 파일 (예: korean_sample.wav)을 준비하세요.
    text
    riva_asr_client \
      --server=localhost:50051 \
      --model_name=stt_ko_kr_conformer-ctc \
      --audio_file=korean_sample.wav \
      --output_tx_file=output.txt \
      --data_type=wav
    • 설명: --server: 서버 주소. --model_name: 한국어 모델 이름 (list_models에서 확인). --audio_file: 테스트 음성 파일. 결과는 output.txt에 텍스트로 저장됩니다. (예: "안녕하세요" 음성이면 "안녕하세요"로 인식)
    • 초보자 팁: 파일 경로를 절대 경로로 쓰세요 (예: /home/user/korean_sample.wav). 인식이 안 되면 샘플 레이트 (16kHz) 확인. 정확도 높이기 위해 --automatic_punctuation=true 추가.
  • 스트리밍 ASR 테스트 (실시간 마이크 입력, 옵션):
    text
    riva_streaming_asr_client \
      --server=localhost:50051 \
      --model_name=stt_ko_kr_conformer-ctc \
      --audio_device=0  # 마이크 ID, arecord -l로 확인
    • 설명: 마이크로 한국어 말하면 실시간으로 텍스트 출력. Ctrl+C로 종료.
    • 초보자 팁: USB 마이크 연결 후 arecord -l로 장치 ID 확인. 노이즈가 많으면 VAD 모델이 도와줍니다.

9. 사용하기 : c# 이용
.proto 파일이 필요하다는데, 제공되는 것을 받을 길이 없어 멈춤