# NVIDIA GPU(레거시)

{% hint style="warning" %}
이 페이지는 구버전의 [이 페이지입니다](https://docs.roboflow.com/roboflow/roboflow-ko/deploy/sdks/enterprise-gpu).
{% endhint %}

## 설치 요구사항

이러한 배포 옵션에는 [Roboflow Enterprise 라이선스가 필요합니다](https://roboflow.com/enterprise).

Enterprise GPU 추론 서버를 배포하려면 먼저 NVIDIA 드라이버와 [nvidia-container-runtime](https://github.com/NVIDIA/nvidia-container-runtime), Docker가 GPU를 추론 서버로 전달(passthrough)할 수 있도록 해야 합니다. 시스템에 이미 `nvidia-container-runtime` 설치되어 있는지, 설치가 성공했는지 다음 명령으로 확인할 수 있습니다:

```
docker run --gpus all -it ubuntu nvidia-smi
```

설치가 성공적이라면 컨테이너 내에서 GPU 장치를 볼 수 있습니다:

```
Tue Nov  9 16:04:47 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   41C    P0    56W / 149W |    504MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
```

GPU TRT 컨테이너를 빌드하기 전에 필요한 마지막 항목은 프로젝트 정보입니다. 여기에 Roboflow API Key, Model ID 및 Model Version이 포함됩니다. 이러한 정보가 없다면 다음 링크를 따라 [프로젝트 정보 찾기](https://github.com/roboflow-ai/roboflow-docs/blob/main/deploy/legacy-documentation/broken-reference/README.md)로 이동하세요. 찾은 후에는 해당 세 변수를 나중에 사용하기 위해 저장하세요.

## Enterprise GPU TRT

Enterprise GPU TRT 배포는 모델을 장치에서 컴파일하여 사용 가능한 하드웨어에 맞게 최적화합니다. GPU TRT 컨테이너에는 현재 세 가지 배포 옵션이 있습니다. AWS를 통한 EC2 배포, Windows의 WSL2 배포, Windows의 Anaconda 배포입니다.

### Amazon EC2 배포

#### AMI 선택 및 EC2 인스턴스 시작

EC2 인스턴스에서 TRT GPU 컨테이너를 실행하려면 먼저 적절한 AMI를 선택해야 합니다. AMI는 인스턴스를 시작할 때 구성할 수 있으며 인스턴스 시작 전에 선택해야 합니다. 여기서는 **NVIDIA GPU-Optimized AMI** 를 사용할 것이며, 이 AMI는 Ubuntu 20.04, Docker 및 기타 요구사항이 사전 설치되어 제공됩니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-578d53f870861b4298a1159123a46fadfd8f771e%2FAMI.jpg?alt=media" alt=""><figcaption><p>NVIDIA GPU-Optimized AMI로 EC2 인스턴스 구성</p></figcaption></figure>

#### SSH로 EC2 인스턴스에 로그인

EC2 인스턴스가 정상적으로 실행되면 SSH와 Amazon Keypair를 사용하여 로그인할 수 있습니다. Amazon은 인스턴스 연결에 대한 문서를 [여기](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)에 제공합니다. Keypair가 준비되어 있고 EC2 인스턴스의 Public DNS를 알고 있다면 아래 명령으로 인스턴스에 로그인할 수 있습니다. 이 인스턴스의 기본 `인스턴스-사용자-이름` 은 *ubuntu입니다.*

```
ssh -i /path/key-pair-name.pem instance-user-name@instance-public-dns-name
```

#### TRT GPU Docker 컨테이너 시작

SSH로 EC2 인스턴스에 로그인한 후 다음 명령으로 Docker 컨테이너를 시작할 수 있습니다:

```
sudo docker run --gpus all -p 9001:9001 --network="host" roboflow/inference-server-trt:latest
```

#### 엔진 컴파일 및 추론 실행

base64로 인코딩한 이미지를 서버에 POST하여 모델에서 추론을 실행하세요 — 캐시 없이 처음으로 모델을 컴파일하는 경우 추론 전에 컴파일이 수행됩니다:

```
base64 your_img.jpg | curl -d @- "http://0.0.0.0:9001/[YOUR MODEL]/[YOUR VERSION]?api_key=[YOUR API KEY]"
```

### Anaconda 배포

#### Anaconda 환경 설정

TRT 컨테이너를 [Anaconda](https://www.anaconda.com/) 또는 [Miniconda](https://docs.conda.io/en/latest/miniconda.html)에서 실행하려면 conda 환경을 만들고 Docker를 설치해야 합니다. 환경을 생성하려면 Anaconda 터미널 내에서 아래 명령을 사용합니다.

```python
conda create -n TRT python=3.8
conda activate TRT
pip install pybase64
```

#### Anaconda 환경에 Docker 설치

Docker는 [Docker Desktop](https://www.docker.com/products/docker-desktop/) 을 통해 다운로드 및 실행할 수 있고, 또는 `conda-forge`를 통해 설치할 수 있습니다. 아래 코드는 Anaconda의 패키지 매니저를 사용하여 Docker를 설치합니다.

```
conda install -c conda-forge docker
```

#### Anaconda 환경 내에서 Docker 컨테이너 실행

Docker Desktop을 설치한 경우 컨테이너에 접근하려면 Docker Desktop이 실행 중인지 확인하세요. Docker Desktop을 다운로드하지 않은 경우 이전의 `conda-forge` 설치 과정

을 통해 데몬 버전의 Docker에 접근할 수 있어야 합니다.

```
Anaconda 환경에서 Docker에 성공적으로 접근할 수 있다면 다음 명령으로 Docker 컨테이너를 시작합니다:
```

#### 엔진 컴파일 및 추론 실행

docker run --gpus all -p 9001:9001 roboflow/inference-server-trt:latest

```
다른 Anaconda 터미널을 열고 추론할 데이터를 포함한 디렉터리로 이동하세요. base64로 인코딩한 이미지를 서버에 POST하여 모델에서 추론을 실행하세요 — 캐시 없이 처음으로 모델을 컴파일하는 경우 추론 전에 컴파일이 수행됩니다:
```

### pybase64 encode your\_img.jpg | curl -d @- "<http://localhost:9001/\\[YOUR> MODEL]/\[YOUR VERSION]?api\_key=\[YOUR API KEY]"

#### Windows Subsystem 배포

Microsoft Store에서 Ubuntu 다운로드

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-b823bec1c7cd4a3290d0514ac23cba5c41ed000b%2FWSL2.jpg?alt=media" alt=""><figcaption><p>Windows에서 TRT 컨테이너를 실행하려는 경우 Anaconda 외에 선택할 수 있는 방법으로 WSL2가 있습니다. Windows Subsystem for Linux는 Windows 10 이상 환경에서 터미널을 통해 Ubuntu를 비동기적으로 실행할 수 있게 합니다. Microsoft Store에서 Ubuntu 20.04.5를 무료로 찾아 다운로드할 수 있습니다. 설치 후에는 Windows 검색창에 Ubuntu를 입력하여 WSL2를 실행하세요.</p></figcaption></figure>

#### Microsoft Store에서 WSL2 설치

WSL2에 Docker 설치(선택 사항) [Docker Desktop](https://www.docker.com/products/docker-desktop/) Ubuntu 20.04.5 LTS에는 Docker가 설치되어 있어야 하지만 설치되어 있지 않은 경우 Ubuntu에 Docker를 설치하기 위한 유용한 명령들이 아래에 있습니다. Anaconda 설치와 유사하게, Docker를 설치할 필요를 [우회하기 위해](https://docs.docker.com/engine/install/ubuntu/)

```
전체 문서는 여기에서 확인할 수 있습니다:
Ubuntu에 Docker Engine 설치
```

#### sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

```
WSL2 내에서 Docker 컨테이너 실행
```

#### 엔진 컴파일 및 추론 실행

WSL2 환경에 Docker를 성공적으로 설치한 후 TRT 컨테이너를 실행할 수 있습니다. 컨테이너를 실행하려면 아래 명령을 사용하여 포트 9001에서 추론을 수신하도록 시작합니다. `sudo docker run --gpus all -p 9001:9001 roboflow/inference-server-trt:latest` 이제 GPU TRT 컨테이너가 Docker에서 실행 중입니다. 다른 Ubuntu 터미널을 열어 Docker 컨테이너로 추론 데이터를 보낼 준비를 합니다. 다음을 사용하세요: `ls` 및

cd

```
base64 your_img.jpg | curl -d @- "http://0.0.0.0:9001/[YOUR MODEL]/[YOUR VERSION]?api_key=[YOUR API KEY]"
```

## 추론을 실행하려는 이미지의 위치로 이동한 다음 아래 명령을 사용하세요.

### 처음 추론하는 경우 모델이 컴파일되는 데 시간이 걸립니다. 모델이 빌드된 후의 추론은 더 빠릅니다.

확장 기능

모델 캐싱

```
특정 경우에 서버가 시작될 때마다 외부 Roboflow 서버와 통신하여 모델을 다운로드할 필요가 없도록 모델을 로컬에 캐시하고 싶을 수 있습니다. 
```

모델을 오프라인으로 캐시하려면 먼저 도커 볼륨을 생성하세요: `docker volume create roboflow` 그런 다음, 도커 볼륨을

```
/cache
```

### 디렉토리에 마운트하여 서버를 시작하세요:

sudo docker run --gpus all -p 9001:9001 --network="host" --mount source=roboflow,target=/cache roboflow/inference-server-trt:latest

```python
Docker Compose를 이용한 다중 GPU 지원
```

Roboflow TRT Docker 컨테이너 사용 예제를 빠르게 확인할 수 있는 리포지토리를 만들었습니다. 시작하려면 아래 git clone 명령으로 docker compose 템플릿을 다운로드하세요. [여기](#configuring-docker-compose.yaml-and-roboflow-nginx.conf).

#### git clone <https://github.com/roboflow/trt-demos.git>

이 예제에서는 로드 밸런서를 사용해 8개의 GPU를 실행하도록 도커를 구성했습니다. 8개 미만의 GPU를 실행해야 하는 경우에 대해서는 [여기](http://nginx.org/en/docs/).

```
로드 밸런서 빌드
```

#### 로드 밸런서 도커 컨테이너를 빌드하려면 아래 명령을 사용하세요. 사용 중인 로드 밸런서에 대한 추가 정보가 필요하면 해당 정보를

docker build . -t lb

```
Docker Compose 실행
```

docker-compose.yaml 파일의 서비스 이름이 .conf/roboflow-nginx.conf 파일에 올바르게 반영되어 있는지 확인한 후 docker compose를 실행하세요.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-d86063bc8018f1338f52a748eb46de7fb33dc04c%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

#### docker-compose up

이제 Docker는 볼륨과 포트를 로드 밸런서와 공유하는 여러 GPU 컨테이너를 시작해야 합니다. 이렇게 하면 로드 밸런서가 각 컨테이너의 처리량을 관리하여 최적의 속도를 유지할 수 있습니다. Docker Desktop에서 실행 중이라면 성공적인 부팅은 대략 다음과 같아야 합니다.

추론 실행

```
GPU 컨테이너와 로드 밸런서가 실행 중이면 로드 밸런서와 상호작용할 수 있으며, 로드 밸런서는 최적의 처리량 유지를 위해 모든 요청을 해당 GPU로 라우팅합니다.
base64 your_img.jpg | curl -d @- "http://0.0.0.0:9001/[YOUR MODEL]/[YOUR VERSION]?api_key=[YOUR API KEY]"

새 터미널을 열고 아래 curl 명령 중 하나를 사용하여 로드 밸런서를 테스트할 수 있습니다.
pip install pybase64 
다른 Anaconda 터미널을 열고 추론할 데이터를 포함한 디렉터리로 이동하세요. base64로 인코딩한 이미지를 서버에 POST하여 모델에서 추론을 실행하세요 — 캐시 없이 처음으로 모델을 컴파일하는 경우 추론 전에 컴파일이 수행됩니다:

# Amazon EC2 배포
base64 your_img.jpg | curl -d @- "http://0.0.0.0:9001/[YOUR MODEL]/[YOUR VERSION]?api_key=[YOUR API KEY]"
```

#### # Anaconda 배포

\# Windows Subsystem Linux

Docker Compose 파일 구성

{% code title="기본 8개 GPU보다 적게 실행하려면 이 리포의 몇몇 파일을 변경해야 합니다. 먼저 살펴볼 파일은 docker-compose.yaml로, Roboflow-GPU-1, Roboflow-GPU-2 등과 같은 여러 서비스가 정의되어 있습니다. 이러한 서비스들이 도커 컨테이너를 실행하고 각 GPU에 연결합니다." lineNumbers="true" %}

```yaml
3개의 GPU만 실행하려면 Roboflow-GPU-1, Roboflow-GPU-2, Roboflow-GPU-3를 제외한 모든 서비스를 삭제하면 됩니다. 서비스를 삭제하려면 서비스 이름을 포함한 줄과 다음 서비스 이름이 나올 때까지의 모든 하위 줄을 제거하세요.
docker-compose.yaml  
  version: "3"
    services:
    Roboflow-GPU-1:
    image: roboflow/inference-server-trt:latest
      restart: always
    volumes:
      - shared-volume:/cache
        deploy:
          resources:
          reservations:
            devices:
            - driver: nvidia
  device_ids: ['0']
    services:
    Roboflow-GPU-1:
    image: roboflow/inference-server-trt:latest
      restart: always
    volumes:
      - shared-volume:/cache
        deploy:
          resources:
          reservations:
            capabilities: [gpu]
            - driver: nvidia
            Roboflow-GPU-2:
```

{% endcode %}

device\_ids: \['1']

<계속>

{% code title="다음으로 편집해야 할 파일은 conf 폴더 안에 있는 roboflow-nginx.conf입니다." lineNumbers="true" %}

```properties
8개에서 3개로 줄이는 예를 계속하면 upstream myapp1의 일부 server 코드 줄을 제거해야 합니다. 특히 17번째 줄부터 21번째 줄은 더 이상 필요하지 않습니다. 이는 목표 숫자를 초과하기 때문입니다.
roboflow-nginx.conf

user  nginx;
worker_processes  auto;


error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;
}

events {
    worker_connections  1024;
        http {
        upstream myapp1 {
        server Roboflow-GPU-1:9001;
        server Roboflow-GPU-2:9001;
        server Roboflow-GPU-3:9001;
        server Roboflow-GPU-4:9001;
        server Roboflow-GPU-5:9001;
        server Roboflow-GPU-6:9001;
    }

    server Roboflow-GPU-7:9001;
        server Roboflow-GPU-8:9001;

        server {
            listen 80;
        }
    }
}
```

{% endcode %}

location / { [proxy\_pass http://myapp1;](#building-the-load-balancer).

### 이 두 파일을 변경한 후에는 docker-compose 튜토리얼을

계속 진행(로드 밸런서 빌드)할 수 있어야 합니다 `TRT 컨테이너에서 Multi-Stream 사용하기`\
\
경우에 따라 동일한 TRT 컨테이너에서 동일한 GPU로 병렬 처리하려는 여러 카메라 스트림이 있을 수 있습니다. TRT 컨테이너에서 여러 모델 서비스를 실행하려면

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-be4fe52e7a0bb0bcbd675ff6ed449d5dd97e8bf9%2Fimage%20(14).png?alt=media" alt=""><figcaption><p>--env NUM_WORKERS=[원하는 num_workers]</p></figcaption></figure>

### NVIDIA V100에서는 2–4개의 워커가 최적의 지연 시간을 제공하는 것으로 나타났습니다.

NVIDIA V100에서 Roboflow Accurate 모델에 대한 TRT 멀티스트림 벤치마크 통계 `TRT 컨테이너에서 GPU 장치 ID 노출하기`특정 경우 TRT 컨테이너를 특정 GPU 또는 vGPU에서 실행하려면 다음을 지정할 수 있습니다:

## CUDA\_VISIBLE\_DEVICES=\[원하는 GPU 또는 MIG ID]

\\

#### [문제 해결](https://app.gitbook.com/s/e5GEiPeDoFksvZv1vH3A/authentication/workspace-and-project-ids)

먼저 요청에 올바른 모델 버전 요청 매개변수가 포함되어 있는지 확인하세요:

`프로젝트 정보 찾기`\
\
최신 컨테이너가 풀(Pull)되었는지 재확인하세요:\\

`sudo docker pull roboflow/inference-server-trt:latest`

`캐시 볼륨을 사용하는 경우 비우세요:`

sudo docker volume rm roboflow

`docker run --gpus all -it ubuntu nvidia-smi`

sudo docker volume create roboflow
