

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 CARLA 執行自動駕駛模擬掃描
<a name="tutorial-carla-simulation"></a>

本教學課程會逐步引導您使用可設定的多感應器擷取執行 [CARLA](https://carla.org/) 自動駕駛模擬參數掃描。您可以建置 Docker 映像，將其推送至 Amazon Elastic Container Registry (Amazon ECR)，並將 [ GitHub 上的自動駕駛 CARLA 任務套件](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/autonomous_driving_carla)提交至截止日期雲端陣列上的 GPU 機群。

此任務會執行車道變更切入案例，其中 NPC 車輛開始於 Ego 車輛後方，在 105 秒的前方階段加速至距離 Ego 20 公尺的位置，然後切入 Ego 車道。它會跨可設定的自我速度、VPC 速度和 NPC 起始距離進行掃描，為每個參數組合建立任務 （預設 2×2×2 = 8 個任務）。每個任務會從您選取的攝影機視點擷取多感應器資料，並產生下列輸出：
+ 來自每個所選攝影機視點的 RGB 影格
+ 語意分割影格
+ LiDAR 點雲 (`.ply`)
+ 2D 和 3D 週框方塊 (KITTI 格式）
+ 每個攝影機案例影片 (H.264 MP4)
+ 拼接網格影片 （如果您選取多個攝影機）

以下影片示範在截止日期雲端上的 CARLA 模擬掃描工作流程。

[![AWS Videos](http://img.youtube.com/vi/xitKHbbBHDw/0.jpg)](http://www.youtube.com/watch?v=xitKHbbBHDw)


**預估時間：**1–2 小時，包括 Docker 映像組建。任務通常會在大約 13 分鐘內完成。

執行本教學課程會針對處理任務的 GPU 工作者執行個體和 Amazon ECR 映像儲存體產生費用。

## 概觀
<a name="tutorial-carla-overview"></a>

若要完成本教學課程，請遵循下列步驟：

1. 完成先決條件。

1. 設定您的陣列。

1. 建置並推送 Docker 映像。

1. 提交模擬任務。

1. 監控任務。

1. 檢閱輸出。

1. 清除資源。

## 先決條件
<a name="tutorial-carla-prerequisites"></a>

開始之前，請先完成下列設定：

1. 如果您還沒有[AWS 帳戶](https://aws.amazon.com/resources/create-account/)，請建立帳戶，確保其可存取 GPU 執行個體 (`g6.4xlarge`建議）。

1. 在本機安裝 [Docker](https://docs.docker.com/get-docker/) 以建置 CARLA 映像。

1. 在帳戶中建立 [Amazon ECR](https://aws.amazon.com/ecr/) 儲存庫以託管建置的映像。

1. 在本機安裝[截止日期雲端 CLI](https://github.com/aws-deadline/deadline-cloud)。

## 設定您的陣列
<a name="tutorial-carla-setup"></a>

您需要具有 Conda 佇列環境 （頻道：`conda-forge`、套件：`ffmpeg`) 和 GPU 機群 （下限：1 個 NVIDIA GPU 搭配 16 vCPU 和 64 GiB 記憶體） 佇列的截止日期雲端陣列。

**IAM 許可** – 您的佇列角色需要 Amazon ECR 提取許可，因為任務指令碼在佇列角色登入資料`docker pull`下執行。連接如下所示的政策：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability"
      ],
      "Resource": "arn:aws:ecr:{{REGION}}:{{ACCOUNT_ID}}:repository/*"
    },
    {
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}
```

**機群主機組態** – 您的機群工作者需要 Docker 和 NVIDIA Container Toolkit。將 [ GitHub 上的 Docker 和 NVIDIA Container Toolkit 主機組態指令碼](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/host_configuration_scripts/docker_nvidia_container_toolkit)連接至您的機群。如需詳細資訊，請參閱[在截止日期雲端工作者上使用 NVIDIA GPUs 執行 Docker 容器](examples-host-config-docker-nvidia.md)。

## 建置並推送 Docker 映像
<a name="tutorial-carla-build-image"></a>

任務會根據 Docker [Hub 上的 carlasim/carla：0.9.16 基礎映像在 Docker](https://hub.docker.com/r/carlasim/carla) 容器內執行。基本 CARLA 映像包含模擬器，但缺少此任務所需的 Python 環境、案例執行器和感應器擷取指令碼。Python 3.10、 `scenario_runner`和 進入點上的自訂映像層，並擷取指令碼，以便每個截止日期雲端任務可以啟動 CARLA、執行駕駛案例，並在單一容器中記錄感應器資料。

**建置和推送 Docker 映像**

1. 如果您沒有 Amazon ECR 儲存庫，請建立 Amazon ECR 儲存庫：

   ```
   aws ecr create-repository --repository-name carla-deadline --region {{REGION}}
   ```

1. 從`autonomous_driving_carla`套件的 `docker/`目錄中，建置映像：

   ```
   cd docker/
   docker build -t carla-deadline:0.9.16 .
   ```
**注意**  
Dockerfile 從 Docker Hub `carlasim/carla:0.9.16` 提取為基礎映像。第一個組建會下載約 8 GB。

1. 將映像推送至 Amazon ECR：

   ```
   aws ecr get-login-password --region {{REGION}} | \
     docker login --username AWS --password-stdin {{ACCOUNT_ID}}.dkr.ecr.{{REGION}}.amazonaws.com
   
   docker tag carla-deadline:0.9.16 \
     {{ACCOUNT_ID}}.dkr.ecr.{{REGION}}.amazonaws.com/carla-deadline:0.9.16
   
   docker push {{ACCOUNT_ID}}.dkr.ecr.{{REGION}}.amazonaws.com/carla-deadline:0.9.16
   ```

## 提交模擬任務
<a name="tutorial-carla-submit"></a>

**使用 GUI 提交者提交任務**

1. 從套件目錄中，開啟提交者：

   ```
   cd autonomous_driving_carla
   deadline bundle gui-submit .
   ```

1. 在**任務特定設定**索引標籤的**案例設定**下，將自我速度、NSC 速度和 NPC 距離設定為逗號分隔的整數。跨產品會建立您的任務網格。

1. 在**攝影機視點**下，選取要擷取的攝影機。**正面**是預設選擇。可用的位置為前、左前、右前、後、左後和右後。

1. 在**進階**下，將**容器映像 URI** 設定為 ，`{{ACCOUNT_ID}}.dkr.ecr.{{REGION}}.amazonaws.com/carla-deadline:0.9.16`以及 Amazon ECR 儲存庫所在的 AWS 區域。

1. 選擇**提交**。

或者，使用 CLI 提交：

```
deadline bundle submit . \
  --farm-id {{FARM_ID}} \
  --queue-id {{QUEUE_ID}} \
  --name "CARLA Lane Change Demo" \
  -p ImageURI={{ACCOUNT_ID}}.dkr.ecr.{{REGION}}.amazonaws.com/carla-deadline:0.9.16 \
  -p AwsRegion={{REGION}}
```

## 監控工作
<a name="tutorial-carla-monitor"></a>

在截止日期雲端主控台中監控進度。每個任務都會在任務資料表中顯示其參數值 (`EgoSpeed`、`NpcSpeed`、`NpcDistance`)。任務通常會在大約 13 分鐘內完成。

日誌輸出會顯示：
+ 案例產生和參數值
+ CARLA 伺服器開機和準備
+ 感應器擷取進度 （每個攝影機的影格計數）
+ 每個攝影機的視訊編碼
+ 網格視訊拼接 （如果您選取多個攝影機）

## 檢閱輸出
<a name="tutorial-carla-output"></a>

**下載輸出**

1. 任務完成後，從您在提交時使用的相同目錄執行下載命令，因此`OutputDir`路徑 （預設 `./outputs`) 會解析為相同的位置：

   ```
   deadline job download-output --job-id {{job-id}}
   ```

1. 截止日期 雲端會將輸出還原至您在提交任務時選取的`OutputDir`目錄。

每個任務都會在其參數名為 的子目錄中產生輸出：

```
outputs/
└── ego20_npc30_dist10/
    ├── rgb/
    │   ├── front/frame_000001.png ... frame_000062.png
    │   └── rear/frame_000001.png ... frame_000062.png
    ├── semantic/
    │   ├── front/...
    │   └── rear/...
    ├── lidar/frame_000001.ply ...
    ├── bbox_2d/{front,rear}/frame_*.txt
    ├── bbox_3d/frame_*.txt
    └── video/
        ├── front_scenario.mp4
        ├── rear_scenario.mp4
        └── grid_scenario.mp4
```

## 已知限制
<a name="tutorial-carla-limitations"></a>
+ **僅限 Linux** – CARLA Docker 映像需要使用 NVIDIA GPU 驅動程式的 Linux 主機。工作者必須在 Linux 機群上執行。
+ **僅限 x86\_64** – CARLA Docker 映像不支援 ARM 架構。
+ 馬**賽克影像** – 當您選取 2 個以上的攝影機時，任務會產生 RGB/語意馬賽克影像。當所有 6 皆為作用中時，配置為 2×3，否則為較小的網格。
+ **擷取速率會隨著攝影機計數而擴展** – 擷取指令碼會在每次排清時同步寫入 PNGs。對於所有 6 個攝影機，每個排清會使用單一攝影機寫入 14 個 PNGs，而不是 2 個 PNG，而增加的 I/O 會將排清速度減到低於 7 個 FPS 目標。影片編碼器固定為 7 FPS，因此相同的案例會產生每個攝影機的較長影片，其中啟用了少數攝影機，而啟用了許多攝影機的較短、更密集的多視角影片。這種同步設計是刻意的權衡，讓範例的架構保持較小且易於調整。生產管道會將感應器 I/O 平行化。

## 清除
<a name="tutorial-carla-cleanup"></a>

為了避免持續收費，請清除您為此教學課程建立的資源：

**清除教學課程資源**

1. 如果您特別為此教學課程建立 GPU 機群，請停止或刪除它。如果您使用預先存在的共用機群，請將其保留在原處。

1. 如果您不再需要映像，請刪除 `carla-deadline`Amazon ECR 儲存庫。

## 相關資源
<a name="tutorial-carla-related"></a>

下列資源提供其他資訊：
+ [GitHub 上的範例原始程式碼](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/autonomous_driving_carla)
+ [CARLA 模擬器](https://carla.org/)
+ [GitHub 上的 Docker 和 NVIDIA Container Toolkit 主機組態指令碼](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/host_configuration_scripts/docker_nvidia_container_toolkit)
+ [在截止日期雲端工作者上使用 NVIDIA GPUs 執行 Docker 容器](examples-host-config-docker-nvidia.md)
+ [截止日期雲端的開啟任務描述 (OpenJD) 範本](build-job-bundle.md)