

# Amazon EC2의 AI/ML 및 HPC 워크로드를 위한 Elastic Fabric Adapter
<a name="efa"></a>

Elastic Fabric Adapter(EFA)는 Amazon EC2 인스턴스에 연결하여 인공 지능(AI), 기계 학습(ML), 고성능 컴퓨팅(HPC) 애플리케이션을 가속화할 수 있는 네트워크 디바이스입니다. EFA를 사용하면 AWS 클라우드가 제공하는 확장성, 유연성, 탄력성을 통해 온프레미스 AI/ML 또는 HPC 클러스터의 애플리케이션 성능을 구현할 수 있습니다.

EFA는 전통적으로 클라우드 기반 HPC 시스템에서 사용하는 TCP 전송보다 지연율이 낮고 일정하며 더 높은 처리량을 제공합니다. 또한 대규모 AI/ML 및 HPC 애플리케이션에서 중요한 인스턴스 간 통신 성능을 확장합니다. 이는 기존 AWS 네트워크 인프라에서 작업하도록 최적화되어 애플리케이션 요구량에 따라 크기를 변경합니다.

EFA는 Libfabric과 통합되며, AI 및 ML 애플리케이션을 위한 Nvidia Collective Communications Library(NCCL) 및 NVIDIA Inference Xfer Library(NIXL)를 지원하고, HPC 애플리케이션을 위한 Open MPI 4.1 이상 및 Intel MPI 2019 Update 5 이상을 지원합니다. NCCL 및 MPI는 Libfabric 1.7.0 이상과 통합됩니다. NIXL은 Libfabric 1.21.0 이상과 통합됩니다.

EFA는 Nitro 버전 4 이상이 설치된 지원되는 대부분의 인스턴스 유형에서 RDMA(Remote Direct Memory Access) 쓰기를 지원합니다. RDMA 읽기는 Nitro 버전 4 이상의 모든 인스턴스에서 지원됩니다. 자세한 내용은 [지원되는 인스턴스 유형](#efa-instance-types) 섹션을 참조하세요.

**Topics**
+ [EFA 기본 사항](#efa-basics)
+ [지원되는 인터페이스 및 라이브러리](#efa-mpi)
+ [지원되는 인스턴스 유형](#efa-instance-types)
+ [지원되는 운영 체제](#efa-os)
+ [EFA 제한 사항](#efa-limits)
+ [EFA 요금](#efa-pricing)
+ [EFA 및 MPI 시작하기](efa-start.md)
+ [EFA 및 NCCL 시작하기](efa-start-nccl.md)
+ [EFA 및 NIXL 시작하기](efa-start-nixl.md)
+ [네트워크 대역폭 극대화](efa-acc-inst-types.md)
+ [EFA 생성 및 연결](create-efa.md)
+ [EFA 분리 및 삭제](detach-efa.md)
+ [EFA 모니터링](efa-working-monitor.md)
+ [EFA 설치 프로그램 확인](efa-verify.md)
+ [릴리스 노트](efa-changelog.md)

## EFA 기본 사항
<a name="efa-basics"></a>

EFA 디바이스는 두 가지 방법으로 EC2 인스턴스에 연결할 수 있습니다.

1. EFA 디바이스와 ENA 디바이스를 모두 생성하는 기존 EFA 인터페이스(ENA 포함 EFA라고도 함)를 사용합니다.

1. EFA 디바이스만 생성하는 EFA 전용 인터페이스를 사용합니다.

EFA 디바이스는 SRD(Scalable Reliable Datagram) 프로토콜을 통해 내장 OS 바이패스 및 혼잡 제어와 같은 기능을 제공합니다. EFA 디바이스 기능을 사용하면 지연 시간이 짧고 안정적인 전송 기능을 통해 EFA 인터페이스가 Amazon EC2의 HPC 및 ML 애플리케이션에 더 나은 애플리케이션 성능을 제공할 수 있습니다. ENA 디바이스는 기존 IP 네트워킹을 제공합니다.

![\[EFA를 사용한 HPC 소프트웨어 스택과 기존 스택 비교.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/efa_stack.png)


전통적으로 AI/ML 애플리케이션은 NCCL 및 NIXL(분산 추론용)을 사용합니다. HPC 애플리케이션은 시스템의 네트워크 전송 인터페이스에 MPI(Message Passing Interface)를 사용했습니다. AWS 클라우드에서 NCCL, NIXL 또는 MPI를 사용하는 애플리케이션 인터페이스를 의미하며 이는 인스턴스 간 네트워크 통신을 위해 운영 체제의 TCP/IP 스택과 ENA 디바이스 드라이버를 사용한다는 의미입니다.

기존 EFA(EFA with ENA) 또는 EFA 전용 인터페이스를 사용하는 AI/ML 애플리케이션은 NCCL 및 NIXL(분산 추론용)을 사용합니다. HPC 애플리케이션은 MPI를 사용하여 Libfabric API와 직접 인터페이스합니다. Libfabric API는 운영 체제 커널을 우회하여 EFA 디바이스와 직접 통신을 통해 네트워크에 패킷을 전송합니다. 이를 통해 오버헤드를 줄이고 AI/ML 및 HPC 애플리케이션을 더욱 효율적으로 실행할 수 있습니다.

**참고**  
Libfabric은 OFI(OpenFabrics Interface) 프레임워크의 핵심 구성 요소로서 OFI의 사용자 공간 API를 정의하고 내보냅니다. 자세한 내용은 [Libfabric OpenFabrics](https://ofiwg.github.io/libfabric/) 웹 사이트를 참조하세요.

### ENA, EFA 및 EFA 전용 네트워크 인터페이스 간의 차이점
<a name="efa-differences"></a>

Amazon EC2는 두 가지 유형의 네트워크 인터페이스를 제공합니다.
+ **ENA** 인터페이스는 VPC를 위한 IP 네트워킹을 지원하는 데 필요한 모든 기존 IP 네트워킹 및 라우팅 기능을 제공합니다. 자세한 내용은 [EC2 인스턴스에서 ENA로 향상된 네트워킹 활성화](enhanced-networking-ena.md) 섹션을 참조하세요.
+ **EFA**(ENA 포함 EFA) 인터페이스는 IP 네트워킹을 위한 ENA 디바이스와 짧은 지연 시간, 높은 처리량 통신을 위한 EFA 디바이스를 모두 제공합니다.
+ **EFA 전용** 인터페이스는 기존 IP 네트워킹을 위한 ENA 디바이스 없이 EFA 디바이스 기능만 지원합니다.

다음 표에서는 ENA, EFA, EFA 전용 네트워크 인터페이스를 비교합니다.


|  | ENA | EFA(ENA 포함 EFA) | EFA 전용 | 
| --- | --- | --- | --- | 
| IP 네트워킹 기능 지원 | 예 | 예 | 아니요 | 
| IPv4 또는 IPv6 주소 할당 가능 | 예 | 예 | 아니요 | 
| 인스턴스의 기본 네트워크 인터페이스로 사용 가능 | 예 | 예 | 아니요 | 
| 인스턴스의 ENI 연결 한도에 포함 | 예 | 예 | 예 | 
| 인스턴스 유형 지원 | 모든 Nitro 기반 인스턴스 유형에서 지원 | [지원되는 인스턴스 유형](#efa-instance-types) | [지원되는 인스턴스 유형](#efa-instance-types) | 
| EC2 API의 파라미터 이름 지정 | interface | efa | efa-only | 
| EC2 콘솔의 필드 이름 지정 | 선택 사항 없음 | ENA 포함 EFA | EFA 전용 | 

## 지원되는 인터페이스 및 라이브러리
<a name="efa-mpi"></a>

EFA는 다음 인터페이스 및 라이브러리를 지원합니다.
+ MPI 4.1 이상 열기
+ 인텔 MPI 2019 업데이트 5 이상
+ NCCL(Nvidia Collective Communications Library) 2.4.2 이상
+ NVIDIA Inference Xfer Library(NIXL) 1.0.0 이상
+ AWS Neuron SDK 버전 2.3 이상

## 지원되는 인스턴스 유형
<a name="efa-instance-types"></a>

다음 인스턴스 유형 모두 EFA를 지원합니다. 또한 표에는 인스턴스 유형에 대한 RDMA 읽기 및 RDMA 쓰기 지원이 표시되어 있습니다.

------
#### [ Nitro v6 ]


| 인스턴스 유형 | RDMA 읽기 지원 | RDMA 쓰기 지원 | 
| --- |--- |--- |
| 범용 | 
| --- |
| m8a.48xlarge | Yes | Yes | 
| m8a.metal-48xl | Yes | Yes | 
| m8azn.24xlarge | Yes | Yes | 
| m8azn.metal-24xl | Yes | Yes | 
| m8gb.16xlarge | Yes | Yes | 
| m8gb.24xlarge | Yes | Yes | 
| m8gb.48xlarge | Yes | Yes | 
| m8gb.metal-24xl | Yes | Yes | 
| m8gb.metal-48xl | Yes | Yes | 
| m8gn.16xlarge | Yes | Yes | 
| m8gn.24xlarge | Yes | Yes | 
| m8gn.48xlarge | Yes | Yes | 
| m8gn.metal-24xl | Yes | Yes | 
| m8gn.metal-48xl | Yes | Yes | 
| m8i.48xlarge | Yes | Yes | 
| m8i.96xlarge | Yes | Yes | 
| m8i.metal-48xl | Yes | Yes | 
| m8i.metal-96xl | Yes | Yes | 
| m8id.48xlarge | Yes | Yes | 
| m8id.96xlarge | Yes | Yes | 
| m8id.metal-48xl | Yes | Yes | 
| m8id.metal-96xl | Yes | Yes | 
| 컴퓨팅 최적화 | 
| --- |
| c8a.48xlarge | Yes | Yes | 
| c8a.metal-48xl | Yes | Yes | 
| c8gb.16xlarge | Yes | Yes | 
| c8gb.24xlarge | Yes | Yes | 
| c8gb.48xlarge | Yes | Yes | 
| c8gb.metal-24xl | Yes | Yes | 
| c8gb.metal-48xl | Yes | Yes | 
| c8gn.16xlarge | Yes | Yes | 
| c8gn.24xlarge | Yes | Yes | 
| c8gn.48xlarge | Yes | Yes | 
| c8gn.metal-24xl | Yes | Yes | 
| c8gn.metal-48xl | Yes | Yes | 
| c8i.48xlarge | Yes | Yes | 
| c8i.96xlarge | Yes | Yes | 
| c8i.metal-48xl | Yes | Yes | 
| c8i.metal-96xl | Yes | Yes | 
| c8id.48xlarge | Yes | Yes | 
| c8id.96xlarge | Yes | Yes | 
| c8id.metal-48xl | Yes | Yes | 
| c8id.metal-96xl | Yes | Yes | 
| 메모리 최적화 | 
| --- |
| r8a.48xlarge | Yes | Yes | 
| r8a.metal-48xl | Yes | Yes | 
| r8gb.16xlarge | Yes | Yes | 
| r8gb.24xlarge | Yes | Yes | 
| r8gb.48xlarge | Yes | Yes | 
| r8gb.metal-24xl | Yes | Yes | 
| r8gb.metal-48xl | Yes | Yes | 
| r8gn.16xlarge | Yes | Yes | 
| r8gn.24xlarge | Yes | Yes | 
| r8gn.48xlarge | Yes | Yes | 
| r8gn.metal-24xl | Yes | Yes | 
| r8gn.metal-48xl | Yes | Yes | 
| r8i.48xlarge | Yes | Yes | 
| r8i.96xlarge | Yes | Yes | 
| r8i.metal-48xl | Yes | Yes | 
| r8i.metal-96xl | Yes | Yes | 
| r8id.48xlarge | Yes | Yes | 
| r8id.96xlarge | Yes | Yes | 
| r8id.metal-48xl | Yes | Yes | 
| r8id.metal-96xl | Yes | Yes | 
| x8aedz.24xlarge | Yes | Yes | 
| x8aedz.metal-24xl | Yes | Yes | 
| x8i.48xlarge | Yes | Yes | 
| x8i.64xlarge | Yes | Yes | 
| x8i.96xlarge | Yes | Yes | 
| x8i.metal-48xl | Yes | Yes | 
| x8i.metal-96xl | Yes | Yes | 
| 스토리지 최적화 | 
| --- |
| i8ge.48xlarge | Yes | No | 
| i8ge.metal-48xl | Yes | No | 
| 가속 컴퓨팅 | 
| --- |
| g7e.8xlarge | Yes | Yes | 
| g7e.12xlarge | Yes | Yes | 
| g7e.24xlarge | Yes | Yes | 
| g7e.48xlarge | Yes | Yes | 
| p6-b200.48xlarge | Yes | Yes | 
| p6-b300.48xlarge | Yes | Yes | 
| 고성능 컴퓨팅 | 
| --- |
| hpc8a.96xlarge | Yes | Yes | 

------
#### [ Nitro v5 ]


| 인스턴스 유형 | RDMA 읽기 지원 | RDMA 쓰기 지원 | 
| --- |--- |--- |
| 범용 | 
| --- |
| m8g.24xlarge | Yes | No | 
| m8g.48xlarge | Yes | No | 
| m8g.metal-24xl | Yes | No | 
| m8g.metal-48xl | Yes | No | 
| m8gd.24xlarge | No | No | 
| m8gd.48xlarge | No | No | 
| m8gd.metal-24xl | No | No | 
| m8gd.metal-48xl | No | No | 
| 컴퓨팅 최적화 | 
| --- |
| c7gn.16xlarge | Yes | No | 
| c7gn.metal | Yes | No | 
| c8g.24xlarge | Yes | No | 
| c8g.48xlarge | Yes | No | 
| c8g.metal-24xl | Yes | No | 
| c8g.metal-48xl | Yes | No | 
| c8gd.24xlarge | No | No | 
| c8gd.48xlarge | No | No | 
| c8gd.metal-24xl | No | No | 
| c8gd.metal-48xl | No | No | 
| 메모리 최적화 | 
| --- |
| r8g.24xlarge | No | No | 
| r8g.48xlarge | No | No | 
| r8g.metal-24xl | No | No | 
| r8g.metal-48xl | No | No | 
| r8gd.24xlarge | No | No | 
| r8gd.48xlarge | No | No | 
| r8gd.metal-24xl | No | No | 
| r8gd.metal-48xl | No | No | 
| x8g.24xlarge | No | No | 
| x8g.48xlarge | No | No | 
| x8g.metal-24xl | No | No | 
| x8g.metal-48xl | No | No | 
| 스토리지 최적화 | 
| --- |
| i7ie.48xlarge | Yes | No | 
| i7ie.metal-48xl | Yes | No | 
| i8g.48xlarge | No | No | 
| i8g.metal-48xl | No | No | 
| 가속 컴퓨팅 | 
| --- |
| p5en.48xlarge | Yes | Yes | 
| p6e-gb200.36xlarge | Yes | Yes | 
| trn2.3xlarge | Yes | Yes | 
| trn2.48xlarge | Yes | Yes | 
| trn2u.48xlarge | Yes | Yes | 
| 고성능 컴퓨팅 | 
| --- |
| hpc7g.4xlarge | Yes | No | 
| hpc7g.8xlarge | Yes | No | 
| hpc7g.16xlarge | Yes | No | 

------
#### [ Nitro v4 ]


| 인스턴스 유형 | RDMA 읽기 지원 | RDMA 쓰기 지원 | 
| --- |--- |--- |
| 범용 | 
| --- |
| m6a.48xlarge | Yes | Yes | 
| m6a.metal | Yes | Yes | 
| m6i.32xlarge | Yes | Yes | 
| m6i.metal | Yes | Yes | 
| m6id.32xlarge | Yes | Yes | 
| m6id.metal | Yes | Yes | 
| m6idn.32xlarge | Yes | Yes | 
| m6idn.metal | Yes | Yes | 
| m6in.32xlarge | Yes | Yes | 
| m6in.metal | Yes | Yes | 
| m7a.48xlarge | Yes | No | 
| m7a.metal-48xl | Yes | No | 
| m7g.16xlarge | Yes | No | 
| m7g.metal | Yes | No | 
| m7gd.16xlarge | Yes | No | 
| m7gd.metal | Yes | No | 
| m7i.48xlarge | Yes | No | 
| m7i.metal-48xl | Yes | No | 
| 컴퓨팅 최적화 | 
| --- |
| c6a.48xlarge | Yes | Yes | 
| c6a.metal | Yes | Yes | 
| c6gn.16xlarge | Yes | Yes | 
| c6i.32xlarge | Yes | Yes | 
| c6i.metal | Yes | Yes | 
| c6id.32xlarge | Yes | Yes | 
| c6id.metal | Yes | Yes | 
| c6in.32xlarge | Yes | Yes | 
| c6in.metal | Yes | Yes | 
| c7a.48xlarge | Yes | No | 
| c7a.metal-48xl | Yes | No | 
| c7g.16xlarge | Yes | Yes | 
| c7g.metal | Yes | Yes | 
| c7gd.16xlarge | Yes | No | 
| c7gd.metal | Yes | No | 
| c7i.48xlarge | Yes | No | 
| c7i.metal-48xl | Yes | No | 
| 메모리 최적화 | 
| --- |
| r6a.48xlarge | Yes | Yes | 
| r6a.metal | Yes | Yes | 
| r6i.32xlarge | Yes | Yes | 
| r6i.metal | Yes | Yes | 
| r6id.32xlarge | Yes | Yes | 
| r6id.metal | Yes | Yes | 
| r6idn.32xlarge | Yes | Yes | 
| r6idn.metal | Yes | Yes | 
| r6in.32xlarge | Yes | Yes | 
| r6in.metal | Yes | Yes | 
| r7a.48xlarge | No | No | 
| r7a.metal-48xl | No | No | 
| r7g.16xlarge | No | No | 
| r7g.metal | No | No | 
| r7gd.16xlarge | No | No | 
| r7gd.metal | No | No | 
| r7i.48xlarge | No | No | 
| r7i.metal-48xl | No | No | 
| r7iz.32xlarge | No | No | 
| r7iz.metal-32xl | No | No | 
| u7i-6tb.112xlarge | Yes | Yes | 
| u7i-8tb.112xlarge | Yes | Yes | 
| u7i-12tb.224xlarge | Yes | Yes | 
| u7in-16tb.224xlarge | Yes | Yes | 
| u7in-24tb.224xlarge | Yes | Yes | 
| u7in-32tb.224xlarge | Yes | Yes | 
| u7inh-32tb.480xlarge | Yes | Yes | 
| x2idn.32xlarge | Yes | Yes | 
| x2idn.metal | Yes | Yes | 
| x2iedn.32xlarge | Yes | Yes | 
| x2iedn.metal | Yes | Yes | 
| 스토리지 최적화 | 
| --- |
| i4g.16xlarge | Yes | Yes | 
| i4i.32xlarge | Yes | Yes | 
| i4i.metal | Yes | Yes | 
| i7i.24xlarge | Yes | No | 
| i7i.48xlarge | Yes | No | 
| i7i.metal-48xl | Yes | No | 
| im4gn.16xlarge | Yes | Yes | 
| 가속 컴퓨팅 | 
| --- |
| f2.48xlarge | Yes | Yes | 
| g6.8xlarge | Yes | Yes | 
| g6.12xlarge | Yes | Yes | 
| g6.16xlarge | Yes | Yes | 
| g6.24xlarge | Yes | Yes | 
| g6.48xlarge | Yes | Yes | 
| g6e.8xlarge | Yes | Yes | 
| g6e.12xlarge | Yes | Yes | 
| g6e.16xlarge | Yes | Yes | 
| g6e.24xlarge | Yes | Yes | 
| g6e.48xlarge | Yes | Yes | 
| gr6.8xlarge | Yes | Yes | 
| p5.4xlarge | Yes | Yes | 
| p5.48xlarge | Yes | Yes | 
| p5e.48xlarge | Yes | Yes | 
| trn1.32xlarge | Yes | Yes | 
| trn1n.32xlarge | Yes | Yes | 
| 고성능 컴퓨팅 | 
| --- |
| hpc6a.48xlarge | Yes | Yes | 
| hpc6id.32xlarge | Yes | Yes | 
| hpc7a.12xlarge | Yes | No | 
| hpc7a.24xlarge | Yes | No | 
| hpc7a.48xlarge | Yes | No | 
| hpc7a.96xlarge | Yes | No | 

------
#### [ Nitro v3 ]


| 인스턴스 유형 | RDMA 읽기 지원 | RDMA 쓰기 지원 | 
| --- |--- |--- |
| 범용 | 
| --- |
| m5dn.24xlarge | No | No | 
| m5dn.metal | No | No | 
| m5n.24xlarge | No | No | 
| m5n.metal | No | No | 
| m5zn.12xlarge | No | No | 
| m5zn.metal | No | No | 
| 컴퓨팅 최적화 | 
| --- |
| c5n.9xlarge | No | No | 
| c5n.18xlarge | No | No | 
| c5n.metal | No | No | 
| 메모리 최적화 | 
| --- |
| r5dn.24xlarge | No | No | 
| r5dn.metal | No | No | 
| r5n.24xlarge | No | No | 
| r5n.metal | No | No | 
| x2iezn.12xlarge | No | No | 
| x2iezn.metal | No | No | 
| 스토리지 최적화 | 
| --- |
| i3en.12xlarge | No | No | 
| i3en.24xlarge | No | No | 
| i3en.metal | No | No | 
| 가속 컴퓨팅 | 
| --- |
| dl1.24xlarge | Yes | No | 
| dl2q.24xlarge | No | No | 
| g4dn.8xlarge | No | No | 
| g4dn.12xlarge | No | No | 
| g4dn.16xlarge | No | No | 
| g4dn.metal | No | No | 
| g5.8xlarge | No | No | 
| g5.12xlarge | No | No | 
| g5.16xlarge | No | No | 
| g5.24xlarge | No | No | 
| g5.48xlarge | No | No | 
| inf1.24xlarge | No | No | 
| p3dn.24xlarge | No | No | 
| p4d.24xlarge | Yes | No | 
| p4de.24xlarge | Yes | No | 
| vt1.24xlarge | No | No | 
| 이전 세대 | 
| --- |
| p3dn.24xlarge | No | No | 

------

**특정 리전에서 EFA를 지원하는 사용 가능한 인스턴스 유형 확인**  
사용 가능한 인스턴스 유형은 리전마다 다릅니다. 리전에서 EFA를 지원하는 사용 가능한 인스턴스 유형을 확인하려면 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 명령을 `--region` 파라미터와 함께 사용합니다. EFA를 지원하는 인스턴스 유형으로 결과 범위를 지정하려면 `--filters` 파라미터를 포함하고 `InstanceType` 값으로 출력 범위를 지정하려면 `--query` 파라미터를 포함합니다.

```
aws ec2 describe-instance-types \
    --region us-east-1  \
    --filters Name=network-info.efa-supported,Values=true \
    --query "InstanceTypes[*].[InstanceType]"  \
    --output text | sort
```

## 지원되는 운영 체제
<a name="efa-os"></a>

운영 체제 지원은 프로세서 유형에 따라 다릅니다. 다음 표는 지원되는 운영 체제를 보여 줍니다.


| 운영 체제 | Intel/AMD(`x86_64`) 인스턴스 유형 | AWS Graviton(`arm64`) 인스턴스 유형 | 
| --- | --- | --- | 
| Amazon Linux 2023 | ✓ | ✓ | 
| Amazon Linux 2 | ✓ | ✓ | 
| RHEL 8 및 9 | ✓ | ✓ | 
| Debian 11, 12 및 13 | ✓ | ✓ | 
| Rocky Linux 8과 9 | ✓ | ✓ | 
| Ubuntu 22.04 및 24.04 | ✓ | ✓ | 
| SUSE Linux Enterprise 15 SP2 이상 | ✓ | ✓ | 
| OpenSUSE Leap 15.5 이상 | ✓ |  | 

**참고**  
나열된 운영 체제 중 일부는 Intel MPI에서 지원되지 않을 수 있습니다. Intel MPI를 사용하는 경우 [ Intel MPI 설명서](https://www.intel.com/content/www/us/en/developer/articles/system-requirements/mpi-library-system-requirements.html)를 참조하여 운영 체제에 대한 지원을 확인하세요.

## EFA 제한 사항
<a name="efa-limits"></a>

EFA에는 다음과 같은 제한 사항이 있습니다.
+ RDMA 쓰기는 일부 인스턴스 유형에서 지원되지 않습니다. 자세한 내용은 [지원되는 인스턴스 유형](#efa-instance-types) 섹션을 참조하세요.
+ P4d/P4de/DL1 인스턴스와 다른 인스턴스 유형 간의 EFA 트래픽1 은 현재 지원되지 않습니다.
+ [여러 네트워크 카드를 지원하는 인스턴스 유형](using-eni.md#network-cards)은 네트워크 카드당 하나의 EFA로 구성할 수 있습니다. 지원되는 다른 모든 인스턴스 유형은 인스턴스당 하나의 EFA만 지원합니다.
+ `c7g.16xlarge`, `m7g.16xlarge` 및 `r7g.16xlarge` 전용 인스턴스 및 전용 호스트의 경우 EFA 연결 시 지원되지 않습니다.
+ EFA 트래픽1은 가용 영역 또는 VPC를 통과할 수 없습니다. 이는 EFA 인터페이스의 ENA 디바이스에서 발생하는 일반 IP 트래픽에는 적용되지 않습니다.
+ EFA 트래픽1은 라우팅할 수 없습니다. EFA 인터페이스의 ENA 디바이스에서 발생하는 일반 IP 트래픽은 라우팅 가능한 상태로 유지됩니다.
+ EFA는 AWS Outposts에서 지원되지 않습니다.
+ EFA(ENA 포함 EFA) 인터페이스의 EFA 디바이스는 AWS Cloud Digital Interface 소프트웨어 개발 키트(AWS CDI SDK) 기반 애플리케이션용 Windows 인스턴스에서만 지원됩니다. CDI SDK 기반이 아닌 애플리케이션의 Windows 인스턴스에 EFA(ENA 포함 EFA) 인터페이스를 연결하면 추가된 EFA 디바이스 기능 없이 ENA 인터페이스로 작동합니다. EFA 전용 인터페이스는 Windows 또는 Linux에서 실행되는 AWS CDI 기반 애플리케이션에서 지원되지 않습니다. 자세한 내용은 [AWS Cloud Digital Interface 소프트웨어 개발 키트(AWS CDI SDK) 사용 설명서](https://docs.aws.amazon.com/CDI-SDK/latest/ug/what-is.html)를 참조하세요.

1*EFA 트래픽*은 EFA(ENA 포함 EFA) 또는 EFA 전용 인터페이스의 EFA 디바이스를 통해 전송되는 트래픽을 말합니다.

## EFA 요금
<a name="efa-pricing"></a>

EFA는 추가 비용 없이 지원되는 모든 인스턴스에서 활성화할 수 있는 선택적 Amazon EC2 네트워킹 기능으로 사용할 수 있습니다.

# Amazon EC2에서 HPC 워크로드를 위한 EFA 및 MPI 시작하기
<a name="efa-start"></a>

이 자습서는 HPC 워크로드를 위한 MPI 지원 인스턴스와 EFA를 시작하는 데 도움이 됩니다.

**참고**  
`u7i-12tb.224xlarge`, `u7in-16tb.224xlarge`, `u7in-24tb.224xlarge`, `u7in-32tb.224xlarge` 인스턴스는 Open MPI를 사용하는 최대 128개의 병렬 MPI 프로세스 또는 Intel MPI를 사용하는 최대 256개의 병렬 MPI 프로세스를 실행할 수 있습니다.

**Topics**
+ [1단계: EFA를 사용한 보안 그룹 준비](#efa-start-security)
+ [2단계: 임시 인스턴스 시작](#efa-start-tempinstance)
+ [3단계: EFA 소프트웨어 설치](#efa-start-enable)
+ [4단계: (선택 사항) Open MPI 5 활성화**](#efa-start-ompi5)
+ [5단계: (*선택 사항*) 인텔 MPI 설치](#efa-start-impi)
+ [6단계: ptrace 보호 비활성화](#efa-start-ptrace)
+ [7단계. 설치 확인](#efa-start-test)
+ [8단계: HPC 애플리케이션 설치](#efa-start-hpc-app)
+ [9단계: EFA 지원 AMI 생성](#efa-start-ami)
+ [10단계: 클러스터 배치 그룹으로 EFA 지원 인스턴스 시작](#efa-start-instances)
+ [11단계: 임시 인스턴스 종료](#efa-start-terminate)
+ [12단계: 암호 없는 SSH 활성화](#efa-start-passwordless)

## 1단계: EFA를 사용한 보안 그룹 준비
<a name="efa-start-security"></a>

EFA에는 보안 그룹 자체 내의 모든 인바운드 및 아웃바운드 트래픽을 허용하는 보안 그룹이 필요합니다. 다음 절차에서는 자체적으로 들어오고 나가는 모든 인바운드 및 아웃바운드 트래픽을 허용하고 SSH 연결을 위해 모든 IPv4 주소의 인바운드 SSH 트래픽을 허용하는 보안 그룹을 생성합니다.

**중요**  
이 보안 그룹은 테스트 목적으로만 사용됩니다. 프로덕션 환경에서는 컴퓨터의 IP 주소 또는 로컬 네트워크의 IP 주소 범위와 같이 연결하려는 IP 주소로부터의 트래픽만 허용하는 인바운드 SSH 규칙을 생성하는 것이 좋습니다.

다른 시나리오는 [다양한 사용 사례에 대한 보안 그룹 규칙](security-group-rules-reference.md) 섹션을 참조하세요.

**EFA 사용 보안 그룹을 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **보안 그룹(Security Groups)**을 선택한 다음, **보안 그룹 생성(Create security group)**을 선택합니다.

1. **보안 그룹 생성(Create security group)** 창에서 다음을 수행합니다.

   1. **보안 그룹 이름**의 경우 `EFA-enabled security group`과 같은 보안 그룹의 고유한 이름을 입력합니다.

   1. (선택 사항) **설명**에 보안 그룹에 대한 간략한 설명을 입력합니다.

   1. **VPC**에서는 EFA 사용 인스턴스를 시작하려는 VPC를 선택합니다.

   1. **보안 그룹 생성**을 선택합니다.

1. 생성한 보안 그룹을 선택하고 **세부 정보(Details)** 탭에서 **보안 그룹 ID(Security group ID)**를 복사합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **인바운드 규칙 편집(Edit inbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **소스 유형(Source type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 추가**를 선택합니다.

   1. **Type(유형)**에서 **SSH**를 선택합니다.

   1. **소스 유형(Source type)**에서 **어디서나 - IPv4(Anywhere - IPv4)**를 선택합니다.

   1. **규칙 저장**을 선택합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **아웃바운드 규칙 편집(Edit outbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **대상 유형(Destination type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 저장**을 선택합니다.

## 2단계: 임시 인스턴스 시작
<a name="efa-start-tempinstance"></a>

EFA 소프트웨어 구성 요소를 설치하고 구성하는 데 사용할 수 있는 임시 인스턴스를 실행합니다. 이 인스턴스를 사용해 EFA를 사용한 AMI을 생성하여 EFA를 사용한 인스턴스를 실행할 수 있습니다.

**임시 인스턴스를 실행합니다.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **Application and OS Images**(애플리케이션 및 OS 이미지) 섹션에서 [지원되는 운영 체제](efa.md#efa-os) 중 하나에 해당하는 AMI를 선택합니다.

1. **인스턴스 유형(Instance type)** 섹션에서 [지원되는 인스턴스 유형(supported instance type)](efa.md#efa-instance-types)을 선택합니다.

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우 **기존 보안 그룹 선택(Select existing security group)**을 선택한 다음에 이전 단계에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (선택 사항) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 시작(Launch instance)**을 선택합니다.

**참고**  
IMDSv2를 이미 [계정의 기본값으로 설정](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)하지 않은 경우 [9단계](#efa-start-ami)에서 생성할 AMI뿐만 아니라 임시 인스턴스에도 IMDSv2를 사용하도록 요구하는 것을 고려해 보세요. IMDSv2 구성 단계에 대한 자세한 내용은 [새 인스턴스에 대한 인스턴스 메타데이터 옵션 구성](configuring-IMDS-new-instances.md) 섹션을 참조하세요.

## 3단계: EFA 소프트웨어 설치
<a name="efa-start-enable"></a>

임시 인스턴스에서 EFA를 지원하는 데 필요한 EFA 사용 커널, EFA 드라이버, Libfabric 및 Open MPI 스택을 설치합니다.

이 단계는 EFA를 Open MPI에서 사용할지, Intel MPI에서 사용할지 또는 Open MPI 및 Intel MPI에서 사용할지에 따라 다릅니다.

**참고**  
일부 운영 체제는 Intel MPI에서 지원되지 않을 수 있습니다. Intel MPI를 사용하는 경우 [ Intel MPI 설명서](https://www.intel.com/content/www/us/en/developer/articles/system-requirements/mpi-library-system-requirements.html)를 참조하여 운영 체제에 대한 지원을 확인하세요.

**EFA 소프트웨어를 설치하려면**

1. 시작한 인스턴스에 연결합니다. 자세한 내용은 [SSH를 사용하여 Linux 인스턴스에 연결](connect-to-linux-instance.md) 섹션을 참조하세요.

1. 모든 소프트웨어 패키지가 최신 상태로 업데이트되어 있는지 확인하기 위해, 인스턴스에서 퀵 소프트웨어 업데이트를 실행합니다. 이 프로세스는 몇 분 정도 걸릴 수 있습니다.
   + Amazon Linux 2023, Amazon Linux 2, RHEL 8/9, Rocky Linux 8/9

     ```
     $ sudo yum update -y
     ```
   + Ubuntu 및 Debian

     ```
     $ sudo apt-get update && sudo apt-get upgrade -y
     ```
   + SUSE Linux Enterprise

     ```
     $ sudo zypper update -y
     ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. EFA 소프트웨어 설치 파일을 다운로드합니다. 소프트웨어 설치 파일은 압축 tarball(`.tar.gz`) 파일로 패키징되어 있습니다. 최신 *안정* 버전을 다운로드하려면 다음 명령을 사용하십시오.

   또한 위의 명령에서 버전 번호를 `latest`로 바꾸면 최신 버전을 얻을 수 있습니다.

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. (*선택 사항*) EFA tarball(`.tar.gz`) 파일의 신뢰성 및 무결성을 확인합니다.

   이 작업을 수행하여 소프트웨어 게시자의 자격 증명을 확인하고 파일이 게시된 이후 변경되거나 손상되지 않았는지 확인하는 것이 좋습니다. tarball 파일을 확인하지 않으려면 이 단계를 건너뜁니다.
**참고**  
또는 MD5 또는 SHA256 체크섬을 대신 사용하여 tarball 파일을 확인하려면 [체크섬을 사용하여 EFA 설치 프로그램 확인](efa-verify.md) 섹션을 참조하세요.

   1. 퍼블릭 GPG 키를 다운로드하고 키 링으로 가져옵니다.

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key
      ```

      명령에서 키 값이 반환됩니다. 다음 단계에서 필요하므로 키 값을 기록해 둡니다.

   1. GPG 키의 지문을 확인합니다. 다음 명령을 실행하고 이전 단계의 키 값을 지정합니다.

      ```
      $ gpg --fingerprint key_value
      ```

      명령에서 `4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC`와 동일한 지문이 반환되어야 합니다. 지문이 일치하지 않으면 EFA 설치 스크립트를 실행하지 말고 지원에 문의하세요.

   1. 서명 파일을 다운로드하고 EFA tarball 파일의 서명을 확인합니다.

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.47.0.tar.gz.sig
      ```

      다음은 출력의 예입니다.

      ```
      gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC
      gpg: Good signature from "Amazon EC2 EFA <ec2-efa-maintainers@amazon.com>"
      gpg: WARNING: This key is not certified with a trusted signature!
      gpg:          There is no indication that the signature belongs to the owner.
      Primary key fingerprint: 4E90 91BC BB97 A96B 26B1  5E59 A054 80B1 DD2D 3CCC
      ```

      결과에 `Good signature`가 있고 이전 단계에서 반환된 지문과 지문이 일치하면 다음 단계로 진행합니다. 그렇지 않은 경우 EFA 설치 스크립트를 실행하지 말고 지원에 문의하세요.

1. 압축 `.tar.gz` 파일에서 파일을 추출하고 추출된 디렉터리로 이동하십시오.

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. EFA 소프트웨어를 설치합니다. 사용 사례에 따라 다음 중 하나를 수행합니다.
**참고**  
**EFA는 SUSE 리눅스에서 NVIDIA GPUDirect를 지원하지 않습니다**. SUSE Linux를 사용하는 경우 kmod 설치를 방지하려면 `--skip-kmod` 옵션을 추가로 지정해야 합니다. 기본적으로 SUSE Linux는 트리 외부 커널 모듈을 허용하지 않습니다.

------
#### [ Open MPI and Intel MPI ]

   Open MPI 및 Intel MPI에서 EFA를 사용하려는 경우 Libfabric 및 Open MPI와 함께 EFA 소프트웨어를 설치해야 하며, **5단계: Intel MPI 설치**를 완료해야 합니다.

   Libfabric 및 Open MPI와 함께 EFA 소프트웨어를 설치하려면 다음 명령을 실행합니다.

**참고**  
EFA 1.30.0부터 Open MPI 4.1 및 Open MPI 5 모두 기본적으로 설치됩니다. 설치하려는 Open MPI 버전을 선택적으로 지정할 수 있습니다. Open MPI 4.1만 설치하려면 `--mpi=openmpi4`를 포함합니다. Open MPI 5만 설치하려면 `--mpi=openmpi5`를 포함합니다. 둘 다 설치하려면 `--mpi` 옵션을 생략합니다.

   ```
   $ sudo ./efa_installer.sh -y
   ```

   Libfabric이 `/opt/amazon/efa`에 설치됩니다. Open MPI 4.1이 `/opt/amazon/openmpi`에 설치됩니다. Open MPI 5가 `/opt/amazon/openmpi5`에 설치됩니다.

------
#### [ Open MPI only ]

   Open MPI에서만 EFA를 사용하려는 경우 Libfabric 및 Open MPI와 함께 EFA 소프트웨어를 설치해야 하며, **5단계: Intel MPI 설치**를 건너뛰어야 합니다. Libfabric 및 Open MPI와 함께 EFA 소프트웨어를 설치하려면 다음 명령을 실행합니다.

**참고**  
EFA 1.30.0부터 Open MPI 4.1 및 Open MPI 5 모두 기본적으로 설치됩니다. 설치하려는 Open MPI 버전을 선택적으로 지정할 수 있습니다. Open MPI 4.1만 설치하려면 `--mpi=openmpi4`를 포함합니다. Open MPI 5만 설치하려면 `--mpi=openmpi5`를 포함합니다. 둘 다 설치하려면 `--mpi` 옵션을 생략합니다.

   ```
   $ sudo ./efa_installer.sh -y
   ```

   Libfabric이 `/opt/amazon/efa`에 설치됩니다. Open MPI 4.1이 `/opt/amazon/openmpi`에 설치됩니다. Open MPI 5가 `/opt/amazon/openmpi5`에 설치됩니다.

------
#### [ Intel MPI only ]

   Intel MPI에서만 EFA를 사용하려는 경우 Libfabric 및 Open MPI 없이 EFA 소프트웨어를 설치할 수 있습니다. 이 경우 Intel MPI는 임베디드 Libfabric을 사용합니다. 이렇게 하려면 **5단계: Intel MPI 설치**를 완료해야 합니다.

   Libfabric 및 Open MPI없이 EFA 소프트웨어를 설치하려면 다음 명령을 실행합니다.

   ```
   $ sudo ./efa_installer.sh -y --minimal
   ```

------

1. EFA 설치 프로그램에서 인스턴스를 재부팅하라는 메시지를 표시하면 인스턴스를 재부팅한 다음 인스턴스에 다시 연결합니다. 그렇게 하지 않으면 인스턴스에서 로그아웃한 다음 다시 로그인하여 설치를 완료합니다.

1. 압축되지 않은 tarball과 tarball 자체를 삭제합니다. 그렇지 않으면 생성한 EFA 지원 AMI에 포함되므로 크기가 늘어납니다.

## 4단계: (선택 사항) Open MPI 5 활성화**
<a name="efa-start-ompi5"></a>

**참고**  
Open MPI 5를 사용하려는 경우에만 이 단계를 수행합니다.

EFA 1.30.0부터 Open MPI 4.1 및 Open MPI 5 모두 기본적으로 설치됩니다. 또는 Open MPI 4.1 또는 Open MPI 5만 설치하도록 선택할 수도 있습니다.

**3단계: EFA 소프트웨어 설치**에서 Open MPI 5를 설치하기로 선택한 후 이를 사용하려는 경우 다음 단계를 수행하여 활성화해야 합니다.

**Open MPI 5를 활성화하는 방법**

1. Open MPI 5를 PATH 환경 변수에 추가합니다.

   ```
   $ module load openmpi5
   ```

1. Open MPI 5를 사용할 수 있도록 활성화했는지 확인합니다.

   ```
   $ which mpicc
   ```

   이 명령은 Open MPI 5 설치 디렉터리(`/opt/amazon/openmpi5`)를 반환해야 합니다.

1. (선택 사항) 인스턴스가 시작될 때마다 Open MPI 5가 PATH 환경 변수에 추가되도록 하려면 다음을 수행합니다.**

------
#### [ bash shell ]

   `module load openmpi5`를 `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 추가합니다.

------
#### [ csh and tcsh shells ]

   `module load openmpi5`을 `/home/username/.cshrc`에 추가합니다.

------

PATH 환경 변수에서 Open MPI 5를 제거해야 하는 경우 다음 명령을 실행하고 쉘 시작 스크립트에서 명령을 제거합니다.

```
$ module unload openmpi5
```

## 5단계: (*선택 사항*) 인텔 MPI 설치
<a name="efa-start-impi"></a>

**중요**  
Intel MPI를 사용하려는 경우에만 이 단계를 수행하세요. Open MPI만 사용하려면 이 단계를 건너뜁니다.

Intel MPI에는 추가 설치 및 환경 변수 구성이 필요합니다.

**사전 조건**  
다음 단계를 수행하는 사용자가 sudo 권한을 가지고 있는지 확인하세요.

**Intel MPI를 설치하려면**

1. 인텔 MPI 설치 스크립트를 다운로드하려면 다음을 수행하세요.

   1. [인텔 웹 사이트](https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html#mpi)를 방문합니다.

   1. 웹 페이지의 **인텔 MPI 라이브러리(Intel MPI Library)** 섹션에서 **Intel MPI Library for Linux** **오프라인(Offline)** 설치 관리자에 대한 링크를 선택합니다.

1. 이전 단계에서 다운로드한 설치 스크립트를 실행합니다.

   ```
   $ sudo bash installation_script_name.sh
   ```

1. 설치 관리자에서 **수락 및 설치(Accept & install)**를 선택합니다.

1. 인텔 개선 프로그램을 읽고 적절한 옵션을 선택한 다음 **설치 시작(Begin Installation)**을 선택합니다.

1. 설치가 완료되면 [**닫기(Close)**]를 선택합니다.

1. 기본적으로 인텔 MPI는 임베디드(내부) Libfabric을 사용합니다. 대신 EFA 설치 프로그램과 함께 제공되는 Libfabric을 사용하도록 인텔 MPI를 구성할 수 있습니다. 일반적으로 EFA 설치 프로그램은 인텔 MPI보다 최신 버전의 Libfabric과 함께 제공됩니다. EFA 설치 프로그램과 함께 제공되는 Libfabric이 인텔 MPI보다 성능이 더 좋은 경우도 있습니다. EFA 설치 프로그램과 함께 제공되는 Libfabric을 사용하도록 인텔 MPI를 구성하려면 셸에 따라 다음 중 하나를 수행합니다.

------
#### [ bash shells ]

   `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

   ```
   export I_MPI_OFI_LIBRARY_INTERNAL=0
   ```

------
#### [ csh and tcsh shells ]

   `/home/username/.cshrc`에 다음 명령문을 추가합니다.

   ```
   setenv I_MPI_OFI_LIBRARY_INTERNAL 0
   ```

------

1. 셸 스크립트에 다음 **source** 명령을 추가하여 설치 디렉터리에서 `vars.sh` 스크립트를 가져와 인스턴스가 시작될 때마다 컴파일러 환경을 설정합니다. 셸에 따라 다음 중 하나를 수행합니다.

------
#### [ bash shells ]

   `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

   ```
   source /opt/intel/oneapi/mpi/latest/env/vars.sh
   ```

------
#### [ csh and tcsh shells ]

   `/home/username/.cshrc`에 다음 명령문을 추가합니다.

   ```
   source /opt/intel/oneapi/mpi/latest/env/vars.csh
   ```

------

1. 기본적으로 잘못된 구성으로 인해 EFA를 사용할 수 없는 경우 인텔 MPI는 기본적으로 TCP/IP 네트워크 스택을 사용하므로 애플리케이션 성능이 느려질 수 있습니다. `I_MPI_OFI_PROVIDER`를 `efa`로 설정하여 이를 방지할 수 있습니다. 그러면 EFA를 사용할 수 없는 경우 인텔 MPI가 다음 오류와 함께 실패합니다.

   ```
   Abort (XXXXXX) on node 0 (rank 0 in comm 0): Fatal error in PMPI_Init: OtherMPI error,
   MPIR_Init_thread (XXX)........:	
   MPID_Init (XXXX)..............:
   MPIDI_OFI_mpi_init_hook (XXXX):
   open_fabric (XXXX)............:
   find_provider (XXXX)..........:
   OFI fi_getinfo() failed (ofi_init.c:2684:find_provider:
   ```

   셸에 따라 다음 중 하나를 수행합니다.

------
#### [ bash shells ]

   `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

   ```
   export I_MPI_OFI_PROVIDER=efa
   ```

------
#### [ csh and tcsh shells ]

   `/home/username/.cshrc`에 다음 명령문을 추가합니다.

   ```
   setenv I_MPI_OFI_PROVIDER efa
   ```

------

1. 기본적으로 인텔 MPI는 디버깅 정보를 인쇄하지 않습니다. 디버깅 정보를 제어하기 위해 다양한 세부 사항 수준을 지정할 수 있습니다. 가능한 값(제공하는 세부 정보의 양순으로)은 `0`(기본값), `1`, `2`, `3`, `4`, `5`입니다. 레벨 `1` 이상은 `libfabric version`과 `libfabric provider`를 인쇄합니다. `libfabric version`을 사용하여 인텔 MPI가 내부 Libfabric을 사용하고 있는지 아니면 EFA 설치 프로그램과 함께 제공되는 Libfabric을 사용하고 있는지 확인합니다. 내부 Libfabric을 사용하는 경우 버전에 `impi`가 접미사로 붙습니다. `libfabric provider`를 사용하여 인텔 MPI가 EFA를 사용하고 있는지 아니면 TCP/IP 네트워크를 사용하고 있는지 확인합니다. EFA를 사용하고 있는 경우 값은 `efa`입니다. TCP/IP를 사용하고 있는 경우 값은 `tcp;ofi_rxm`입니다.

   디버깅 정보를 활성화하려면 셸에 따라 다음 중 하나를 수행합니다.

------
#### [ bash shells ]

   `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

   ```
   export I_MPI_DEBUG=value
   ```

------
#### [ csh and tcsh shells ]

   `/home/username/.cshrc`에 다음 명령문을 추가합니다.

   ```
   setenv I_MPI_DEBUG value
   ```

------

1. 기본적으로 인텔 MPI는 노드 내 통신을 위해 운영 체제의 공유 메모리(`shm`)를 사용하고 노드 간 통신에만 Libfabric(`ofi`)을 사용합니다. 일반적으로 이 구성은 최상의 성능을 제공합니다. 그러나 경우에 따라 인텔 MPI shm 패브릭으로 인해 특정 애플리케이션이 무기한 중단될 수 있습니다.

   이 문제를 해결하려면 인텔 MPI가 노드 내 통신과 노드 간 통신 모두에 Libfabric을 사용하도록 합니다. 이렇게 하려면 셸에 따라 다음 중 하나를 수행합니다.

------
#### [ bash shells ]

   `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

   ```
   export I_MPI_FABRICS=ofi
   ```

------
#### [ csh and tcsh shells ]

   `/home/username/.cshrc`에 다음 명령문을 추가합니다.

   ```
   setenv I_MPI_FABRICS ofi
   ```

------
**참고**  
EFA Libfabric 제공업체는 노드 내 통신을 위해 운영 체제의 공유 메모리를 사용합니다. 즉, `I_MPI_FABRICS`를 `ofi`로 설정하면 기본 `shm:ofi` 구성과 유사한 성능을 얻을 수 있습니다.

1. 인스턴스에서 로그아웃한 후 다시 로그인합니다.

Intel MPI를 더 이상 사용하지 않으려면 셸 시작 스크립트에서 환경 변수를 제거하세요.

## 6단계: ptrace 보호 비활성화
<a name="efa-start-ptrace"></a>

HPC 애플리케이션의 성능을 향상시키기 위해 Libfabric에서는 프로세스가 동일한 인스턴스에서 실행 중일 때 프로세스 간 통신에 인스턴스의 로컬 메모리를 사용합니다.

공유 메모리 기능은 *ptrace 보호*에서 지원되지 않는 CMA(Cross Memory Attach)를 사용합니다. Ubuntu와 같이 기본적으로 ptrace 보호가 활성화되어 있는 Linux 배포 버전을 사용하는 경우 이를 비활성화해야 합니다. Linux 배포 버전에 ptrace 보호가 기본적으로 활성화되어 있지 않으면 이 단계를 건너뜁니다.

**ptrace 보호를 비활성화하려면**  
다음 중 하나를 수행하세요.
+ 테스트 목적으로 ptrace 보호를 일시적으로 비활성화하려면 다음 명령을 실행하세요.

  ```
  $ sudo sysctl -w kernel.yama.ptrace_scope=0
  ```
+ ptrace 보호를 영구적으로 비활성화하려면 `kernel.yama.ptrace_scope = 0`을 `/etc/sysctl.d/10-ptrace.conf`에 추가하고 인스턴스를 재부팅합니다.

## 7단계. 설치 확인
<a name="efa-start-test"></a>

**설치 성공 확인**

1. 다음 명령을 실행하여 MPI가 성공적으로 설치되었는지 확인:

   ```
   $ which mpicc
   ```
   + Open MPI의 경우 반환되는 경로에 `/opt/amazon/`가 포함됩니다.
   + Intel MPI의 경우 반환되는 경로에 `/opt/intel/`이 포함됩니다. 예상한 출력이 나오지 않는 경우 Intel MPI `vars.sh` 스크립트를 소싱했는지 확인합니다.

1. EFA 소프트웨어 구성 요소와 Libfabric 가 성공적으로 설치되었는지 확인하려면 다음 명령을 실행합니다.

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   이 명령은 Libfabric EFA 인스턴스에 대한 정보를 반환합니다. 다음은 해당 명령 출력을 보여주는 예제입니다.

   ```
   provider: efa
       fabric: EFA-fe80::94:3dff:fe89:1b70
       domain: efa_0-rdm
       version: 2.0
       type: FI_EP_RDM
       protocol: FI_PROTO_EFA
   ```

## 8단계: HPC 애플리케이션 설치
<a name="efa-start-hpc-app"></a>

임시 인스턴스에 HPC 애플리케이션을 설치합니다. 설치 절차는 HPC 애플리케이션에 따라 다릅니다. 자세한 내용은 *Amazon Linux 2 사용 설명서*의 [Manage software on your AL2 instance](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)를 참조하세요.

**참고**  
설치 지침은 HPC 애플리케이션의 설명서를 참조하세요.

## 9단계: EFA 지원 AMI 생성
<a name="efa-start-ami"></a>

필수 소프트웨어 구성 요소를 설치한 뒤 AMI를 사용하여 EFA 사용 인스턴스를 재사용하고 시작합니다.

**임시 인스턴스에서 AMI를 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택하고 [**작업(Actions)**], [**이미지(Image)**], [**이미지 생성(Create image)**]을 선택합니다.

1. [**이미지 생성(Create image)**]에서 다음을 수행합니다.

   1. [**이미지 이름(Image name)**]에 AMI를 설명하는 이름을 입력합니다.

   1. (선택 사항) [**이미지 설명(Image description)**]에 AMI의 용도에 대한 간략한 설명을 입력합니다.

   1. **이미지 생성(Create image)**을 선택합니다.

1. 탐색 창에서 **AMI**를 선택합니다.

1. 목록에서 생성한 AMI를 찾습니다. 상태가 `pending`에서 `available`로 바뀔 때까지 기다린 후 다음 단계를 계속합니다.

## 10단계: 클러스터 배치 그룹으로 EFA 지원 인스턴스 시작
<a name="efa-start-instances"></a>

**7단계**에서 생성한 EFA이 지원되는 AMI를 사용한 클러스터 배치 그룹과 **1단계**에서 생성한 EFA를 지원하는 보안 그룹에 EFA를 사용한 인스턴스를 시작합니다.

**참고**  
클러스터 배치 그룹에 EFA 지원 인스턴스를 시작할 필요는 없습니다. 그러나 EFA가 지원되는 인스턴스를 클러스터 배치 그룹에서 실행하면 단일 가용 영역의 지연율이 낮은 그룹 인스턴스를 시작하기 때문에 권장합니다.
클러스터 인스턴스를 확장할 때 용량을 사용할 수 있도록 하려면 클러스터 배치 그룹에 대한 용량 예약을 생성할 수 있습니다. 자세한 내용은 [클러스터 배치 그룹에서 용량 예약 사용](cr-cpg.md) 섹션을 참조하세요.

**인스턴스 시작**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **애플리케이션 및 OS 이미지(Application and OS Images)** 섹션에서 **내 AMI(My AMIs)**를 선택한 다음에 이전 단계에서 생성한 AMI를 선택합니다.

1. **인스턴스 유형(Instance type)** 섹션에서 [지원되는 인스턴스 유형(supported instance type)](efa.md#efa-instance-types)을 선택합니다.

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우 **기존 보안 그룹 선택(Select existing security group)**을 선택한 다음에 이전 단계에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (*선택 사항*) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. (*선택 사항*) **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.

1. **고급 세부 정보(Advanced details)** 섹션에서 **배치 그룹 이름(Placement group name)**의 경우 인스턴스를 시작할 클러스터 배치 그룹을 선택합니다. 새 클러스터 배치 그룹을 생성해야 하는 경우 **새 배치 그룹 생성(Create new placement group)**을 선택합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 개수(Number of instances)**의 경우 시작하려는 EFA 사용 인스턴스 개수를 입력한 다음에 **인스턴스 시작(Launch instance)**을 선택합니다.

## 11단계: 임시 인스턴스 종료
<a name="efa-start-terminate"></a>

이 단계에서는 [2단계](#efa-start-tempinstance)에서 시작한 인스턴스가 필요하지 않습니다. 추가 요금이 발생하지 않도록 해당 인스턴스를 종료할 수 있습니다.

**임시 인스턴스 종료**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택한 다음 **작업**, **인스턴스 상태**, **인스턴스 종료(삭제)**를 선택합니다.

1. 확인 메시지가 표시되면 **종료(삭제)**를 선택합니다.

## 12단계: 암호 없는 SSH 활성화
<a name="efa-start-passwordless"></a>

클러스터의 모든 인스턴스에서 실행하도록 애플리케이션을 활성화하려면 리더 노드에서 멤버 노드로의 암호 없는 SSH 액세스를 사용해야 합니다. 리더 노드는 애플리케이션을 실행할 인스턴스입니다. 클러스터의 나머지 인스턴스는 멤버 노드입니다,

**클러스터의 인스턴스 간에 암호 없는 SSH를 사용하려면**

1. 클러스터의 인스턴스 1개를 리더 노드로 선택하고 연결합니다.

1. `strictHostKeyChecking`을 비활성화하고 리더 노드에서 `ForwardAgent`를 활성화합니다. 원하는 텍스트 편집기를 사용하여 `~/.ssh/config`를 열고 다음을 추가합니다.

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. RSA 키 페어 생성:

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   키 페어는 `$HOME/.ssh/` 디렉터리에 생성됩니다.

1. 리더 노드에서 프라이빗 키의 사용 권한을 변경합니다.

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/id_rsa.pub`를 열고 키를 추가합니다.

1. 클러스터의 각 멤버 노드에 대해 다음을 수행합니다.

   1. 인스턴스에 연결합니다.

   1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/authorized_keys`를 열고 앞에서 복사한 퍼블릭 키를 추가합니다.

1. 암호 없는 SSH가 예상대로 작동하는지 테스트하려면 리더 노드에 연결하고 다음 명령을 실행합니다.

   ```
   $ ssh member_node_private_ip
   ```

   키 또는 암호를 입력하라는 메시지가 표시되지 않은 상태에서 멤버 노드에 연결해야 합니다.

# Amazon EC2에서 ML 워크로드를 위한 EFA 및 NCCL 시작하기
<a name="efa-start-nccl"></a>

NVIDIA Collective Communications Library(NCCL)는 단일 노드 또는 여러 노드에서 여러 GPU를 위한 표준 집합적 통신 루틴의 라이브러입니다. NCCL은 EFA, Libfabric 및 MPI와 함께 사용하여 다양한 기계 학습 워크로드를 지원할 수 있습니다. 자세한 내용은 [NCCL](https://developer.nvidia.com/nccl) 웹 사이트를 참조하세요.

**요구 사항**
+ 가속 컴퓨팅 P 시리즈 인스턴스 유형만 지원됩니다. 자세한 내용은 [Amazon EC2 가속 컴퓨팅 인스턴스](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html#ac-sizes)를 참조하세요.
+ Amazon Linux 2,023, Amazon Linux 2, Ubuntu 24.04, Ubuntu 22.04 기본 AMI만 지원됩니다.
+ NCCL 2.4.2 이상만 EFA에서 지원됩니다.

AWS Deep Learning AMIs를 사용하여 EFA 및 NCCL로 기계 학습 워크로드를 실행하는 방법에 대한 자세한 내용은 *AWS Deep Learning AMIs 개발자 가이드*의 [Using EFA on the DLAMI](https://docs.aws.amazon.com/dlami/latest/devguide/tutorial-efa-using.html)를 참조하세요.

**Topics**
+ [1단계: EFA를 사용한 보안 그룹 준비](#nccl-start-base-setup)
+ [2단계: 임시 인스턴스 시작](#nccl-start-base-temp)
+ [3단계: Nvidia GPU 드라이버, Nvidia CUDA 툴킷 및 cuDNN 설치](#nccl-start-base-drivers)
+ [4단계: GDRCopy 설치](#nccl-start-base-gdrcopy)
+ [5단계: EFA 소프트웨어 설치](#nccl-start-base-enable)
+ [6단계: NCCL 설치](#nccl-start-base-nccl)
+ [7단계: NCCL 테스트 설치](#nccl-start-base-tests)
+ [8단계: EFA 및 NCCL 구성 테스트](#nccl-start-base-test)
+ [9단계: 기계 학습 애플리케이션 설치](#nccl-start-base-app)
+ [10단계: EFA 및 NCCL 지원 AMI 생성](#nccl-start-base-ami)
+ [11단계: 임시 인스턴스 종료](#nccl-start-base-terminate)
+ [12단계: 클러스터 배치 그룹에 EFA 및 NCCL 지원 인스턴스 시작](#nccl-start-base-cluster)
+ [13단계: 암호 없는 SSH 사용](#nccl-start-base-passwordless)

## 1단계: EFA를 사용한 보안 그룹 준비
<a name="nccl-start-base-setup"></a>

EFA에는 보안 그룹 자체 내의 모든 인바운드 및 아웃바운드 트래픽을 허용하는 보안 그룹이 필요합니다. 다음 절차에서는 자체적으로 들어오고 나가는 모든 인바운드 및 아웃바운드 트래픽을 허용하고 SSH 연결을 위해 모든 IPv4 주소의 인바운드 SSH 트래픽을 허용하는 보안 그룹을 생성합니다.

**중요**  
이 보안 그룹은 테스트 목적으로만 사용됩니다. 프로덕션 환경에서는 컴퓨터의 IP 주소 또는 로컬 네트워크의 IP 주소 범위와 같이 연결하려는 IP 주소로부터의 트래픽만 허용하는 인바운드 SSH 규칙을 생성하는 것이 좋습니다.

다른 시나리오는 [다양한 사용 사례에 대한 보안 그룹 규칙](security-group-rules-reference.md) 섹션을 참조하세요.

**EFA 사용 보안 그룹을 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **보안 그룹(Security Groups)**을 선택한 다음, **보안 그룹 생성(Create security group)**을 선택합니다.

1. **보안 그룹 생성(Create security group)** 창에서 다음을 수행합니다.

   1. **보안 그룹 이름**의 경우 `EFA-enabled security group`과 같은 보안 그룹의 고유한 이름을 입력합니다.

   1. (선택 사항) **설명**에 보안 그룹에 대한 간략한 설명을 입력합니다.

   1. **VPC**에서는 EFA 사용 인스턴스를 시작하려는 VPC를 선택합니다.

   1. **보안 그룹 생성**을 선택합니다.

1. 생성한 보안 그룹을 선택하고 **세부 정보(Details)** 탭에서 **보안 그룹 ID(Security group ID)**를 복사합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **인바운드 규칙 편집(Edit inbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **소스 유형(Source type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 추가**를 선택합니다.

   1. **Type(유형)**에서 **SSH**를 선택합니다.

   1. **소스 유형(Source type)**에서 **어디서나 - IPv4(Anywhere - IPv4)**를 선택합니다.

   1. **규칙 저장**을 선택합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **아웃바운드 규칙 편집(Edit outbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **대상 유형(Destination type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 저장**을 선택합니다.

## 2단계: 임시 인스턴스 시작
<a name="nccl-start-base-temp"></a>

EFA 소프트웨어 구성 요소를 설치하고 구성하는 데 사용할 수 있는 임시 인스턴스를 실행합니다. 이 인스턴스를 사용해 EFA를 사용한 AMI을 생성하여 EFA를 사용한 인스턴스를 실행할 수 있습니다.

**임시 인스턴스를 실행합니다.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **애플리케이션 및 OS 이미지** 섹션에서 지원되는 운영 체제 중 하나에 해당하는 AMI를 선택합니다.

1. **인스턴스 유형** 섹션에서 지원되는 인스턴스 유형을 선택합니다.

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우 **기존 보안 그룹 선택(Select existing security group)**을 선택한 다음에 이전 단계에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (*선택 사항*) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.
**참고**  
Nvidia CUDA 도구 키트에 사용할 10\$120GiB의 스토리지를 추가로 프로비저닝해야 합니다. 스토리지를 충분히 프로비저닝하지 않으면 Nvidia 드라이버 및 CUDA 도구 키트를 설치하려고 할 때 `insufficient disk space`오류가 발생합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 시작(Launch instance)**을 선택합니다.

## 3단계: Nvidia GPU 드라이버, Nvidia CUDA 툴킷 및 cuDNN 설치
<a name="nccl-start-base-drivers"></a>

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**Nvidia GPU 드라이버 및 Nvidia CUDA 툴킷 및 cuDNN을 설치하려면**

1. 모든 소프트웨어 패키지가 최신 상태로 업데이트되어 있는지 확인하기 위해, 인스턴스에서 퀵 소프트웨어 업데이트를 실행합니다.

   ```
   $ sudo yum upgrade -y && sudo reboot
   ```

   인스턴스가 재부팅되면 다시 연결합니다.

1. Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트를 설치하는 데 필요한 유틸리티를 설치합니다.

   ```
   $ sudo yum groupinstall 'Development Tools' -y
   ```

1. `nouveau` 오픈 소스 드라이버를 사용 중단합니다.

   1. 현재 실행 중인 커널의 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.

      ```
      $ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
      ```

   1. `nouveau`를 `/etc/modprobe.d/blacklist.conf ` 거부 목록 파일에 추가합니다.

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. `grub` 파일에 `GRUB_CMDLINE_LINUX="rdblacklist=nouveau"`를 추가하고 Grub 구성을 다시 구축합니다.

      ```
      $ echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' | sudo tee -a /etc/default/grub \
      && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. 필요한 리포지토리 준비

   1. EPEL 리포지토리를 활성화하고 배포를 `rhel7`으로 설정합니다.

      ```
      $ sudo amazon-linux-extras install epel \
      && distribution='rhel7'
      ```

   1. CUDA 네트워크 리포지토리를 설정하고 리포지토리 캐시를 업데이트합니다.

      ```
      $ ARCH=$( /bin/arch ) \
      && sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo \
      && sudo yum clean expire-cache
      ```

   1. (*커널 버전 5.10에만 해당*) 커널 버전 5.10과 함께 Amazon Linux 2를 사용하는 경우에만 이 단계를 수행합니다. 커널 버전 4.12와 함께 Amazon Linux 2를 사용하는 경우 다음 단계를 건너뜁니다. 커널 버전을 확인하려면 **uname -r**을 실행합니다.

      1. `/etc/dkms/nvidia.conf`라는 이름의 Nvidia 드라이버 구성 파일을 생성합니다.

         ```
         $ sudo mkdir -p /etc/dkms \
         && echo "MAKE[0]=\"'make' -j2 module SYSSRC=\${kernel_source_dir} IGNORE_XEN_PRESENCE=1 IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 CC=/usr/bin/gcc10-gcc\"" | sudo tee /etc/dkms/nvidia.conf
         ```

      1. (`p4d.24xlarge` 및 `p5.48xlarge`만 해당) Nvidia 드라이버 구성 파일을 복사합니다.

         ```
         $ sudo cp /etc/dkms/nvidia.conf /etc/dkms/nvidia-open.conf
         ```

1. Nvidia GPU 드라이버, Nvidia CUDA 도구 키트 및 cuDNN을 설치합니다.

   ```
   $ sudo yum clean all \
   && sudo yum -y install nvidia-driver-latest-dkms \
   && sudo yum -y install cuda-drivers-fabricmanager cuda libcudnn8-devel
   ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. (`p4d.24xlarge` 및 `p5.48xlarge`만 해당) Nvidia Fabric Manager 서비스를 시작하고 인스턴스가 시작될 때 자동으로 시작되는지 확인합니다. Nvidia 패브릭 관리자는 NV 스위치 관리에 필요합니다.

   ```
   $ sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
   ```

1. 인스턴스가 시작될 때마다 CUDA 경로가 설정되는지 확인합니다.
   + *bash* 셸의 경우 `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + *tcsh* 셸의 경우 `/home/username/.cshrc`에 다음 명령문을 추가합니다.

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. Nvidia GPU 드라이버가 작동하는지 확인하려면 다음 명령을 실행합니다.

   ```
   $ nvidia-smi -q | head
   ```

   명령을 실행하면 Nvidia GPU, Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트에 대한 정보가 반환되어야 합니다.

------
#### [ Ubuntu 24.04 and Ubuntu 22.04 ]

**Nvidia GPU 드라이버 및 Nvidia CUDA 툴킷 및 cuDNN을 설치하려면**

1. 모든 소프트웨어 패키지가 최신 상태로 업데이트되어 있는지 확인하기 위해, 인스턴스에서 퀵 소프트웨어 업데이트를 실행합니다.

   ```
   $ sudo apt-get update && sudo apt-get upgrade -y
   ```

1. Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트를 설치하는 데 필요한 유틸리티를 설치합니다.

   ```
   $ sudo apt-get update && sudo apt-get install build-essential -y
   ```

1. Nvidia GPU 드라이버를 사용하려면, 우선 `nouveau` 오픈 소스 드라이버를 비활성화해야 합니다.

   1. 현재 실행 중인 커널의 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.

      ```
      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
      ```

   1. `nouveau`를 `/etc/modprobe.d/blacklist.conf ` 거부 목록 파일에 추가합니다.

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. 원하는 텍스트 편집기를 사용하여 `/etc/default/grub`를 열고 다음을 추가합니다.

      ```
      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
      ```

   1. Grub 구성을 다시 빌드합니다.

      ```
      $ sudo update-grub
      ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. CUDA 리포지토리를 추가하고 Nvidia GPU 드라이버, NVIDIA CUDA 도구 키트 및 cuDNN을 설치합니다.
   + `p3dn.24xlarge`

     ```
     $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
     && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
     && sudo dpkg -i /tmp/deeplearning.deb \
     && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
     && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
     && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
     && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
     && sudo apt update \
     && sudo apt install nvidia-dkms-535 \
     && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
     ```
   + `p4d.24xlarge` 및 `p5.48xlarge`

     ```
     $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
     && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
     && sudo dpkg -i /tmp/deeplearning.deb \
     && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
     && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
     && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
     && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
     && sudo apt update \
     && sudo apt install nvidia-kernel-open-535 \
     && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
     ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. (`p4d.24xlarge` 및 `p5.48xlarge`만 해당) Nvidia Fabric Manager를 설치합니다.

   1. 이전 단계에서 설치한 Nvidia 커널 모듈의 버전과 일치하는 Nvidia Fabric Manager 버전을 설치해야 합니다.

      다음 명령을 실행하여 Nvidia 커널 모듈의 버전을 확인합니다.

      ```
      $ cat /proc/driver/nvidia/version | grep "Kernel Module"
      ```

      다음은 예제 출력입니다.

      ```
      NVRM version: NVIDIA UNIX x86_64 Kernel Module  450.42.01  Tue Jun 15 21:26:37 UTC 2021
      ```

      위 예제에서 커널 모듈의 메이저 버전 `450`이 설치되었습니다. 즉, Nvidia Fabric Manager 버전 `450`을 설치해야 합니다.

   1. Nvidia Fabric Manager를 설치합니다. 다음 명령을 실행하고 이전 단계에서 식별된 메이저 버전을 지정합니다.

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number
      ```

      예를 들어, 커널 모듈의 메이저 버전 `450`이 설치된 경우 다음 명령을 사용하여 일치하는 버전의 Nvidia Fabric Manager를 설치합니다.

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450
      ```

   1. 서비스를 시작하고 인스턴스가 시작될 때 서비스가 자동으로 시작되는지 확인합니다. Nvidia 패브릭 관리자는 NV 스위치 관리에 필요합니다.

      ```
      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
      ```

1. 인스턴스가 시작될 때마다 CUDA 경로가 설정되는지 확인합니다.
   + *bash* 셸의 경우 `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + *tcsh* 셸의 경우 `/home/username/.cshrc`에 다음 명령문을 추가합니다.

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. Nvidia GPU 드라이버가 작동하는지 확인하려면 다음 명령을 실행합니다.

   ```
   $ nvidia-smi -q | head
   ```

   명령을 실행하면 Nvidia GPU, Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트에 대한 정보가 반환되어야 합니다.

------

## 4단계: GDRCopy 설치
<a name="nccl-start-base-gdrcopy"></a>

GDRCopy를 설치하여 Libfabric의 성능을 향상합니다. GDRCopy에 관한 자세한 내용은 [GDRCopy 리포지토리](https://github.com/NVIDIA/gdrcopy)를 참조하세요.

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**GDRCopy 설치 방법**

1. 필요한 종속 항목을 설치합니다.

   ```
   $ sudo yum -y install dkms rpm-build make check check-devel subunit subunit-devel
   ```

1. GDRCopy 패키지를 다운로드하여 압축을 풉니다.

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz ; cd gdrcopy-2.4/packages
   ```

1. GDRCopy RPM 패키지를 빌드합니다.

   ```
   $ CUDA=/usr/local/cuda ./build-rpm-packages.sh
   ```

1. GDRCopy RPM 패키지를 설치합니다.

   ```
   $ sudo rpm -Uvh gdrcopy-kmod-2.4-1dkms.noarch*.rpm \
   && sudo rpm -Uvh gdrcopy-2.4-1.x86_64*.rpm \
   && sudo rpm -Uvh gdrcopy-devel-2.4-1.noarch*.rpm
   ```

------
#### [ Ubuntu 24.04 and Ubuntu 22.04 ]

**GDRCopy 설치 방법**

1. 필요한 종속 항목을 설치합니다.

   ```
   $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
   ```

1. GDRCopy 패키지를 다운로드하여 압축을 풉니다.

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz \
   && cd gdrcopy-2.4/packages
   ```

1. GDRCopy RPM 패키지를 빌드합니다.

   ```
   $ CUDA=/usr/local/cuda ./build-deb-packages.sh
   ```

1. GDRCopy RPM 패키지를 설치합니다.

   ```
   $ sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \
   && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb
   ```

------

## 5단계: EFA 소프트웨어 설치
<a name="nccl-start-base-enable"></a>

인스턴스에서 EFA를 지원하는 데 필요한 EFA 사용 커널, EFA 드라이버, Libfabric, aws-ofi-nccl 플러그인 및 Open MPI 스택을 설치합니다.

**EFA 소프트웨어를 설치하려면**

1. 시작한 인스턴스에 연결합니다. 자세한 내용은 [SSH를 사용하여 Linux 인스턴스에 연결](connect-to-linux-instance.md) 섹션을 참조하세요.

1. EFA 소프트웨어 설치 파일을 다운로드합니다. 소프트웨어 설치 파일은 압축 tarball(`.tar.gz`) 파일로 패키징되어 있습니다. 최신 *안정* 버전을 다운로드하려면 다음 명령을 사용하십시오.

   또한 위의 명령에서 버전 번호를 `latest`로 바꾸면 최신 버전을 얻을 수 있습니다.

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. (*선택 사항*) EFA tarball(`.tar.gz`) 파일의 신뢰성 및 무결성을 확인합니다.

   이 작업을 수행하여 소프트웨어 게시자의 자격 증명을 확인하고 파일이 게시된 이후 변경되거나 손상되지 않았는지 확인하는 것이 좋습니다. tarball 파일을 확인하지 않으려면 이 단계를 건너뜁니다.
**참고**  
또는 MD5 또는 SHA256 체크섬을 대신 사용하여 tarball 파일을 확인하려면 [체크섬을 사용하여 EFA 설치 프로그램 확인](efa-verify.md) 섹션을 참조하세요.

   1. 퍼블릭 GPG 키를 다운로드하고 키 링으로 가져옵니다.

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key
      ```

      명령에서 키 값이 반환됩니다. 다음 단계에서 필요하므로 키 값을 기록해 둡니다.

   1. GPG 키의 지문을 확인합니다. 다음 명령을 실행하고 이전 단계의 키 값을 지정합니다.

      ```
      $ gpg --fingerprint key_value
      ```

      명령에서 `4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC`와 동일한 지문이 반환되어야 합니다. 지문이 일치하지 않으면 EFA 설치 스크립트를 실행하지 말고 지원에 문의하세요.

   1. 서명 파일을 다운로드하고 EFA tarball 파일의 서명을 확인합니다.

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.47.0.tar.gz.sig
      ```

      다음은 출력의 예입니다.

      ```
      gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC
      gpg: Good signature from "Amazon EC2 EFA <ec2-efa-maintainers@amazon.com>"
      gpg: WARNING: This key is not certified with a trusted signature!
      gpg:          There is no indication that the signature belongs to the owner.
      Primary key fingerprint: 4E90 91BC BB97 A96B 26B1  5E59 A054 80B1 DD2D 3CCC
      ```

      결과에 `Good signature`가 있고 이전 단계에서 반환된 지문과 지문이 일치하면 다음 단계로 진행합니다. 그렇지 않은 경우 EFA 설치 스크립트를 실행하지 말고 지원에 문의하세요.

1. 압축 `.tar.gz` 파일에서 파일을 추출하고 추출된 디렉터리로 이동하십시오.

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. EFA 소프트웨어 설치 스크립트를 실행합니다.
**참고**  
EFA 1.30.0부터 Open MPI 4.1 및 Open MPI 5 모두 기본적으로 설치됩니다. Open MPI 5가 필요하지 않은 경우 Open MPI 4.1만 설치하는 것이 좋습니다. 다음 명령은 Open MPI 4.1만 설치합니다. Open MPI 4.1 및 Open MPI 5를 설치하려면 `--mpi=openmpi4`를 제거합니다.

   ```
   $ sudo ./efa_installer.sh -y --mpi=openmpi4
   ```

   **Libfabric**은 `/opt/amazon/efa` 디렉터리에 설치됩니다. **aws-ofi-nccl 플러그인**은 `/opt/amazon/ofi-nccl` 디렉터리에 설치됩니다. **Open MPI**는 `/opt/amazon/openmpi` 디렉터리에 설치됩니다.

1. EFA 설치 프로그램에서 인스턴스를 재부팅하라는 메시지를 표시하면 인스턴스를 재부팅한 다음 인스턴스에 다시 연결합니다. 그렇게 하지 않으면 인스턴스에서 로그아웃한 다음 다시 로그인하여 설치를 완료합니다.

1. EFA 소프트웨어 구성 요소가 성공적으로 설치되었는지 확인합니다.

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   이 명령은 Libfabric EFA 인스턴스에 대한 정보를 반환합니다. 다음은 해당 명령 출력을 보여주는 예제입니다.
   + `p3dn.24xlarge` 및 단일 네트워크 인터페이스

     ```
     provider: efa
     fabric: EFA-fe80::94:3dff:fe89:1b70
     domain: efa_0-rdm
     version: 2.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```
   + `p4d.24xlarge` 및 `p5.48xlarge`와 여러 네트워크 인터페이스

     ```
     provider: efa
     fabric: EFA-fe80::c6e:8fff:fef6:e7ff
     domain: efa_0-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c34:3eff:feb2:3c35
     domain: efa_1-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c0f:7bff:fe68:a775
     domain: efa_2-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::ca7:b0ff:fea6:5e99
     domain: efa_3-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```

## 6단계: NCCL 설치
<a name="nccl-start-base-nccl"></a>

NCCL을 설치합니다. NCCL에 대한 자세한 내용은 [NCCL 리포지토리](https://github.com/NVIDIA/nccl)를 참조하세요.

**NCCL을 설치하려면**

1. `/opt` 디렉터리로 이동합니다.

   ```
   $ cd /opt
   ```

1. 공식 NCCL 리포지토리를 인스터스에 복제하고 복제된 로컬 리포지토리로 이동합니다.

   ```
   $ sudo git clone https://github.com/NVIDIA/nccl.git -b v2.23.4-1 && cd nccl
   ```

1. NCCL을 빌드 및 설치하고 CUDA 설치 디렉터리를 지정합니다.

   ```
   $ sudo make -j src.build CUDA_HOME=/usr/local/cuda
   ```

## 7단계: NCCL 테스트 설치
<a name="nccl-start-base-tests"></a>

NCCL 테스트를 설치합니다. NCCL 테스트를 통해 NCCL이 올바르게 설치되었는지와 예상대로 작동하는지 확인할 수 있습니다. NCCL 테스트에 대한 자세한 내용은 [nccl-tests 리포지토리](https://github.com/NVIDIA/nccl-tests)를 참조하세요.

**NCCL 테스트를 설치하려면**

1. 홈 디렉터리로 이동합니다.

   ```
   $ cd $HOME
   ```

1. 공식 nccl-tests 리포지토리를 인스터스에 복제하고 복제된 로컬 리포지토리로 이동합니다.

   ```
   $ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
   ```

1. Libfabric 디렉터리를 `LD_LIBRARY_PATH` 변수에 추가합니다.
   + Amazon Linux 2023 및 Amazon Linux 2

     ```
     $ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
     ```
   + Ubuntu 24.04 및 Ubuntu 22.04

     ```
     $ export LD_LIBRARY_PATH=/opt/amazon/efa/lib:$LD_LIBRARY_PATH
     ```

1. NCCL 테스트를 설치하고 MPI, NCCL 및 CUDA 설치 디렉터리를 지정합니다.

   ```
   $ make MPI=1 MPI_HOME=/opt/amazon/openmpi NCCL_HOME=/opt/nccl/build CUDA_HOME=/usr/local/cuda
   ```

## 8단계: EFA 및 NCCL 구성 테스트
<a name="nccl-start-base-test"></a>

테스트를 실행하여 임시 인스턴스가 EFA 및 NCCL에 대해 올바르게 구성되었는지 확인합니다.

**EFA 및 NCCL 구성을 테스트하려면**

1. 테스트를 실행할 호스트를 지정하는 호스트 파일을 생성합니다. 다음 명령은 인스턴스 자체에 대한 참조를 포함하는 `my-hosts`라는 호스트 파일을 생성합니다.

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
   && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
   ```

------

1. 테스트를 실행하고 호스트 파일(`--hostfile`) 및 사용할 GPU 수(`-n`)를 지정합니다. 다음 명령은 인스턴스 자체의 8개 GPU에서 `all_reduce_perf` 테스트를 실행하고 다음 환경 변수를 지정합니다.
   + `FI_EFA_USE_DEVICE_RDMA=1` - (`p4d.24xlarge`만 해당) 단방향 및 양방향 전송을 위해 디바이스의 RDMA 기능을 사용합니다.
   + `NCCL_DEBUG=INFO` - 세부 디버깅 출력을 사용합니다. 또한 `VERSION`을 지정하여 테스트 시작 시 NCCL 버전만 인쇄하거나 `WARN`을 지정하여 오류 메시지만 수신할 수 있습니다.

   NCCL 테스트 알고리즘에 대한 자세한 내용은 공식 nccl-tests 리포지토리에서 [NCCL Tests README](https://github.com/NVIDIA/nccl-tests/blob/master/README.md)를 참조하세요.
   + `p3dn.24xlarge`

     ```
     $ /opt/amazon/openmpi/bin/mpirun \
     -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/amazon/ofi-nccl/lib:$LD_LIBRARY_PATH \
     -x NCCL_DEBUG=INFO \
     --hostfile my-hosts -n 8 -N 8 \
     --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
     $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
     ```
   + `p4d.24xlarge` 및 `p5.48xlarge`

     ```
     $ /opt/amazon/openmpi/bin/mpirun \
     -x FI_EFA_USE_DEVICE_RDMA=1 \
     -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/amazon/ofi-nccl/lib:$LD_LIBRARY_PATH \
     -x NCCL_DEBUG=INFO \
     --hostfile my-hosts -n 8 -N 8 \
     --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
     $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
     ```

1. `NCCL_DEBUG` 로그가 인쇄될 때 EFA가 NCCL의 기본 공급자로 활성화되어 있는지 확인할 수 있습니다.

   ```
   ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Selected Provider is efa*
   ```

   `p4d.24xlarge` 인스턴스를 사용할 때 다음과 같은 추가 정보가 표시됩니다.

   ```
   ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Running on P4d platform, Setting NCCL_TOPO_FILE environment variable to /home/ec2-user/install/plugin/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml
   ```

## 9단계: 기계 학습 애플리케이션 설치
<a name="nccl-start-base-app"></a>

기계 학습 애플리케이션을 임시 인스턴스에 설치합니다. 설치 절차는 기계 학습 애플리케이션에 따라 다릅니다. Linux 인스턴스에 소프트웨어를 설치하는 데 대한 자세한 내용은 [Amazon Linux 2 인스턴스에서 소프트웨어 관리](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)를 참조하세요.

**참고**  
설치 지침은 기계 학습 애플리케이션의 설명서를 참조하세요.

## 10단계: EFA 및 NCCL 지원 AMI 생성
<a name="nccl-start-base-ami"></a>

필수 소프트웨어 구성 요소를 설치한 뒤 AMI를 사용하여 EFA 사용 인스턴스를 재사용하고 시작합니다.

**임시 인스턴스에서 AMI를 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택하고 [**작업(Actions)**], [**이미지(Image)**], [**이미지 생성(Create image)**]을 선택합니다.

1. [**이미지 생성(Create image)**]에서 다음을 수행합니다.

   1. [**이미지 이름(Image name)**]에 AMI를 설명하는 이름을 입력합니다.

   1. (선택 사항) [**이미지 설명(Image description)**]에 AMI의 용도에 대한 간략한 설명을 입력합니다.

   1. **이미지 생성(Create image)**을 선택합니다.

1. 탐색 창에서 **AMI**를 선택합니다.

1. 목록에서 생성한 AMI를 찾습니다. 상태가 `pending`에서 `available`로 바뀔 때까지 기다린 후 다음 단계를 계속합니다.

## 11단계: 임시 인스턴스 종료
<a name="nccl-start-base-terminate"></a>

이 단계에서는 시작한 임시 인스턴스가 더 이상 필요하지 않습니다. 추가 요금이 발생하지 않도록 해당 인스턴스를 종료할 수 있습니다.

**임시 인스턴스 종료**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택하고 **작업(Actions)**, **인스턴스 상태(Instance state)**, **인스턴스 종료(Terminate instance)**를 선택합니다.

1. 확인 메시지가 나타나면 **종료(Terminate)**를 선택합니다.

## 12단계: 클러스터 배치 그룹에 EFA 및 NCCL 지원 인스턴스 시작
<a name="nccl-start-base-cluster"></a>

앞서 생성한 EFA 사용 AMI 및 EFA 사용 보안 그룹을 사용하여 클러스터 배치 그룹으로 EFA 및 NCCL 사용 인스턴스를 시작합니다.

**참고**  
클러스터 배치 그룹에 EFA 지원 인스턴스를 시작할 필요는 없습니다. 그러나 EFA가 지원되는 인스턴스를 클러스터 배치 그룹에서 실행하면 단일 가용 영역의 지연율이 낮은 그룹 인스턴스를 시작하기 때문에 권장합니다.
클러스터 인스턴스를 확장할 때 용량을 사용할 수 있도록 하려면 클러스터 배치 그룹에 대한 용량 예약을 생성할 수 있습니다. 자세한 내용은 [클러스터 배치 그룹에서 용량 예약 사용](cr-cpg.md) 섹션을 참조하세요.

------
#### [ New console ]

**임시 인스턴스를 실행합니다.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **애플리케이션 및 OS 이미지(Application and OS Images)** 섹션에서 **내 AMI(My AMIs)**를 선택한 다음에 이전 단계에서 생성한 AMI를 선택합니다.

1. **인스턴스 유형(Instance type)** 섹션에서.`p3dn.24xlarge` 또는 `p4d.24xlarge`를 선택합니다

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우 **기존 보안 그룹 선택(Select existing security group)**을 선택한 다음에 이전 단계에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (선택 사항) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. (*선택 사항*) **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.

1. **고급 세부 정보(Advanced details)** 섹션에서 **배치 그룹 이름(Placement group name)**의 경우 인스턴스를 시작할 클러스터 배치 그룹을 선택합니다. 새 클러스터 배치 그룹을 생성해야 하는 경우 **새 배치 그룹 생성(Create new placement group)**을 선택합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 개수(Number of instances)**의 경우 시작하려는 EFA 사용 인스턴스 개수를 입력한 다음에 **인스턴스 시작(Launch instance)**을 선택합니다.

------
#### [ Old console ]

**클러스터 배치 그룹으로 EFA 및 NCCL 사용 인스턴스를 시작하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. **인스턴스 시작**을 선택합니다.

1. [**AMI 선택(Choose an AMI)**] 페이지에서 [**내 AMI(My AMIs)**]를 선택하고 앞서 생성한 AMI를 찾은 다음 [**선택(Select)**]을 선택합니다.

1. **인스턴스 유형 선택** 페이지에서 **p3dn.24xlarge**와 **다음: 인스턴스 세부 정보 구성**을 차례대로 선택합니다.

1. [**Configure Instance Details**] 페이지에서 다음을 수행합니다.

   1. [**인스턴스 수(Number of instances)**]에 시작하려는 EFA 및 NCCL 사용 인스턴스 수를 입력합니다.

   1. **네트워크** 및 **서브넷**에서 인스턴스를 시작할 VPC와 서브넷을 선택합니다.

   1. **배치 그룹**에서 **배치 그룹에 인스턴스를 추가**를 선택합니다.

   1. **배치 그룹 이름**에서 **새 배치 그룹에 추가**를 선택한 다음 배치 그룹을 설명하는 이름을 입력합니다. **배치 그룹 전략**에서 **클러스터**를 선택합니다.

   1. **EFA**에서 **활성화**를 선택합니다.

   1. **네트워크 인터페이스** 항목의 디바이스 **eth0**에서 **새 네트워크 인터페이스**를 선택합니다. 하나의 기본 IPv4 주소와 하나 이상의 보조 IPv4 주소를 입력할 수도 있습니다. 연결된 IPv6 CIDR 블록이 있는 서브넷에서 인스턴스를 시작하는 경우 기본 IPv6 주소 및 하나 이상의 보조 IPv6 주소를 지정할 수도 있습니다.

   1. **다음: 스토리지 추가**를 선택합니다.

1. [**스토리지 추가(Add Storage)**] 페이지에서 인스턴스에 연결할 볼륨과 AMI에서 지정한 볼륨(예: 루트 디바이스 볼륨)을 지정합니다. **다음: 태그 추가**를 선택합니다.

1. **태그 추가** 페이지에서 사용자에게 친숙한 이름 등의 인스턴스 태그를 지정한 후 **다음: 보안 그룹 구성(Next: Configure Security Group)**을 선택합니다.

1. **보안 그룹 구성** 페이지의 **보안 그룹 할당**에서 **기존 보안 그룹 선택**을 선택한 다음 앞에서 생성한 보안 그룹을 선택합니다.

1. [**검토 및 시작(Review and Launch)**]를 선택합니다.

1. **인스턴스 시작 검토** 페이지에서 설정을 검토한 후 **시작**을 선택하여 키 페어를 선택하고 인스턴스를 시작합니다.

------

## 13단계: 암호 없는 SSH 사용
<a name="nccl-start-base-passwordless"></a>

클러스터의 모든 인스턴스에서 실행하도록 애플리케이션을 활성화하려면 리더 노드에서 멤버 노드로의 암호 없는 SSH 액세스를 사용해야 합니다. 리더 노드는 애플리케이션을 실행할 인스턴스입니다. 클러스터의 나머지 인스턴스는 멤버 노드입니다,

**클러스터의 인스턴스 간에 암호 없는 SSH를 사용하려면**

1. 클러스터의 인스턴스 1개를 리더 노드로 선택하고 연결합니다.

1. `strictHostKeyChecking`을 비활성화하고 리더 노드에서 `ForwardAgent`를 활성화합니다. 원하는 텍스트 편집기를 사용하여 `~/.ssh/config`를 열고 다음을 추가합니다.

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. RSA 키 페어 생성:

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   키 페어는 `$HOME/.ssh/` 디렉터리에 생성됩니다.

1. 리더 노드에서 프라이빗 키의 사용 권한을 변경합니다.

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/id_rsa.pub`를 열고 키를 추가합니다.

1. 클러스터의 각 멤버 노드에 대해 다음을 수행합니다.

   1. 인스턴스에 연결합니다.

   1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/authorized_keys`를 열고 앞에서 복사한 퍼블릭 키를 추가합니다.

1. 암호 없는 SSH가 예상대로 작동하는지 테스트하려면 리더 노드에 연결하고 다음 명령을 실행합니다.

   ```
   $ ssh member_node_private_ip
   ```

   키 또는 암호를 입력하라는 메시지가 표시되지 않은 상태에서 멤버 노드에 연결해야 합니다.

# Amazon EC2에서 추론 워크로드를 위한 EFA 및 NIXL 시작하기
<a name="efa-start-nixl"></a>

NVIDIA Inference Xfer Library(NIXL)는 분해된 추론 워크로드를 위해 특별히 설계된 처리량이 높고 지연 시간이 짧은 통신 라이브러리입니다. NIXL을 EFA 및 Libfabric과 함께 사용하여 프리필 노드와 디코딩 노드 간의 KV 캐시 전송을 지원할 수 있으며 다양한 스토리지 계층 간의 효율적인 KV 캐시 이동을 지원합니다. 자세한 내용은 [NIXL](https://github.com/ai-dynamo/nixl) 웹사이트를 참조하세요.

**요구 사항**
+ Ubuntu 24.04 및 Ubuntu 22.04 기반 AMI만 지원됩니다.
+ EFA는 NIXL 1.0.0 이상만 지원합니다.

**Topics**

## 1단계: EFA를 사용한 보안 그룹 준비
<a name="nixl-start-base-setup"></a>

EFA에는 보안 그룹 자체 내의 모든 인바운드 및 아웃바운드 트래픽을 허용하는 보안 그룹이 필요합니다. 다음 절차에서는 자체적으로 들어오고 나가는 모든 인바운드 및 아웃바운드 트래픽을 허용하고 SSH 연결을 위해 모든 IPv4 주소의 인바운드 SSH 트래픽을 허용하는 보안 그룹을 생성합니다.

**중요**  
이 보안 그룹은 테스트 목적으로만 사용됩니다. 프로덕션 환경에서는 컴퓨터의 IP 주소 또는 로컬 네트워크의 IP 주소 범위와 같이 연결하려는 IP 주소로부터의 트래픽만 허용하는 인바운드 SSH 규칙을 생성하는 것이 좋습니다.

다른 시나리오는 [다양한 사용 사례에 대한 보안 그룹 규칙](security-group-rules-reference.md) 섹션을 참조하세요.

**EFA 사용 보안 그룹을 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **보안 그룹(Security Groups)**을 선택한 다음, **보안 그룹 생성(Create security group)**을 선택합니다.

1. **보안 그룹 생성(Create security group)** 창에서 다음을 수행합니다.

   1. **보안 그룹 이름**의 경우 `EFA-enabled security group`과 같은 보안 그룹의 고유한 이름을 입력합니다.

   1. (선택 사항) **설명**에 보안 그룹에 대한 간략한 설명을 입력합니다.

   1. **VPC**에서는 EFA 사용 인스턴스를 시작하려는 VPC를 선택합니다.

   1. **보안 그룹 생성**을 선택합니다.

1. 생성한 보안 그룹을 선택하고 **세부 정보(Details)** 탭에서 **보안 그룹 ID(Security group ID)**를 복사합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **인바운드 규칙 편집(Edit inbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **소스 유형(Source type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 추가**를 선택합니다.

   1. **Type(유형)**에서 **SSH**를 선택합니다.

   1. **소스 유형(Source type)**에서 **어디서나 - IPv4(Anywhere - IPv4)**를 선택합니다.

   1. **규칙 저장**을 선택합니다.

1. 보안 그룹을 선택한 상태에서 **작업(Actions)**, **아웃바운드 규칙 편집(Edit outbound rules)**을 선택한 후 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **대상 유형(Destination type)**에서 **사용자 지정(Custom)**을 선택하고 복사한 보안 그룹 ID를 필드에 붙여넣습니다.

   1. **규칙 저장**을 선택합니다.

## 2단계: 임시 인스턴스 시작
<a name="nixl-start-base-temp"></a>

EFA 소프트웨어 구성 요소를 설치하고 구성하는 데 사용할 수 있는 임시 인스턴스를 실행합니다. 이 인스턴스를 사용해 EFA를 사용한 AMI을 생성하여 EFA를 사용한 인스턴스를 실행할 수 있습니다.

**임시 인스턴스를 실행합니다.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **애플리케이션 및 OS 이미지** 섹션에서 지원되는 운영 체제 중 하나에 해당하는 AMI를 선택합니다. [DLAMI 릴리스 정보 페이지](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes)에서 지원되는 DLAMI를 선택할 수도 있습니다.

1. **인스턴스 유형** 섹션에서 지원되는 인스턴스 유형을 선택합니다.

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우 **기존 보안 그룹 선택(Select existing security group)**을 선택한 다음에 이전 단계에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (*선택 사항*) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.
**참고**  
Nvidia CUDA 도구 키트에 사용할 10\$120GiB의 스토리지를 추가로 프로비저닝해야 합니다. 스토리지를 충분히 프로비저닝하지 않으면 Nvidia 드라이버 및 CUDA 도구 키트를 설치하려고 할 때 `insufficient disk space`오류가 발생합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 시작(Launch instance)**을 선택합니다.

**중요**  
AMI에 이미 Nvidia GPU 드라이버, CUDA 툴킷 및 cuDNN이 포함되어 있거나 비 GPU 인스턴스를 사용하는 경우 3단계를 건너뜁니다.

## 3단계: Nvidia GPU 드라이버, Nvidia CUDA 툴킷 및 cuDNN 설치
<a name="nixl-start-base-drivers"></a>

**Nvidia GPU 드라이버 및 Nvidia CUDA 툴킷 및 cuDNN을 설치하려면**

1. 모든 소프트웨어 패키지가 최신 상태로 업데이트되어 있는지 확인하기 위해, 인스턴스에서 퀵 소프트웨어 업데이트를 실행합니다.

   ```
   $ sudo apt-get update && sudo apt-get upgrade -y
   ```

1. Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트를 설치하는 데 필요한 유틸리티를 설치합니다.

   ```
   $ sudo apt-get install build-essential -y
   ```

1. Nvidia GPU 드라이버를 사용하려면, 우선 `nouveau` 오픈 소스 드라이버를 비활성화해야 합니다.

   1. 현재 실행 중인 커널의 버전에 필요한 유틸리티와 커널 헤더 패키지를 설치합니다.

      ```
      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
      ```

   1. `nouveau`를 `/etc/modprobe.d/blacklist.conf ` 거부 목록 파일에 추가합니다.

      ```
      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
      blacklist vga16fb
      blacklist nouveau
      blacklist rivafb
      blacklist nvidiafb
      blacklist rivatv
      EOF
      ```

   1. 원하는 텍스트 편집기를 사용하여 `/etc/default/grub`를 열고 다음을 추가합니다.

      ```
      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
      ```

   1. Grub 구성을 다시 빌드합니다.

      ```
      $ sudo update-grub
      ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. CUDA 리포지토리를 추가하고 Nvidia GPU 드라이버, NVIDIA CUDA 도구 키트 및 cuDNN을 설치합니다.

   ```
   $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \
   && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \
   && sudo dpkg -i /tmp/deeplearning.deb \
   && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \
   && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \
   && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \
   && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \
   && sudo apt update \
   && sudo apt install nvidia-dkms-535 \
   && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
   ```

1. 인스턴스를 재부팅하고 다시 연결합니다.

1. (`p4d.24xlarge` 및 `p5.48xlarge`만 해당) Nvidia Fabric Manager를 설치합니다.

   1. 이전 단계에서 설치한 Nvidia 커널 모듈의 버전과 일치하는 Nvidia Fabric Manager 버전을 설치해야 합니다.

      다음 명령을 실행하여 Nvidia 커널 모듈의 버전을 확인합니다.

      ```
      $ cat /proc/driver/nvidia/version | grep "Kernel Module"
      ```

      다음은 예제 출력입니다.

      ```
      NVRM version: NVIDIA UNIX x86_64 Kernel Module  450.42.01  Tue Jun 15 21:26:37 UTC 2021
      ```

      위 예제에서 커널 모듈의 메이저 버전 `450`이 설치되었습니다. 즉, Nvidia Fabric Manager 버전 `450`을 설치해야 합니다.

   1. Nvidia Fabric Manager를 설치합니다. 다음 명령을 실행하고 이전 단계에서 식별된 메이저 버전을 지정합니다.

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number
      ```

      예를 들어, 커널 모듈의 메이저 버전 `450`이 설치된 경우 다음 명령을 사용하여 일치하는 버전의 Nvidia Fabric Manager를 설치합니다.

      ```
      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450
      ```

   1. 서비스를 시작하고 인스턴스가 시작될 때 서비스가 자동으로 시작되는지 확인합니다. Nvidia 패브릭 관리자는 NV 스위치 관리에 필요합니다.

      ```
      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
      ```

1. 인스턴스가 시작될 때마다 CUDA 경로가 설정되는지 확인합니다.
   + *bash* 셸의 경우 `/home/username/.bashrc` 및 `/home/username/.bash_profile`에 다음 명령문을 추가합니다.

     ```
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```
   + *tcsh* 셸의 경우 `/home/username/.cshrc`에 다음 명령문을 추가합니다.

     ```
     setenv PATH=/usr/local/cuda/bin:$PATH
     setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
     ```

1. Nvidia GPU 드라이버가 작동하는지 확인하려면 다음 명령을 실행합니다.

   ```
   $ nvidia-smi -q | head
   ```

   명령을 실행하면 Nvidia GPU, Nvidia GPU 드라이버 및 Nvidia CUDA 도구 키트에 대한 정보가 반환되어야 합니다.

**중요**  
AMI에 이미 GDRCopy가 포함되어 있거나 비 GPU 인스턴스를 사용하는 경우 4단계를 건너뜁니다.

## 4단계: GDRCopy 설치
<a name="nixl-start-base-gdrcopy"></a>

GPU 기반 플랫폼에서 Libfabric의 성능을 향상하려면 GDRCopy를 설치하세요. GDRCopy에 관한 자세한 내용은 [GDRCopy 리포지토리](https://github.com/NVIDIA/gdrcopy)를 참조하세요.

**GDRCopy 설치 방법**

1. 필요한 종속 항목을 설치합니다.

   ```
   $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
   ```

1. GDRCopy 패키지를 다운로드하여 압축을 풉니다.

   ```
   $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \
   && tar xf v2.4.tar.gz \
   && cd gdrcopy-2.4/packages
   ```

1. GDRCopy DEB 패키지를 빌드합니다.

   ```
   $ CUDA=/usr/local/cuda ./build-deb-packages.sh
   ```

1. GDRCopy DEB 패키지를 설치합니다.

   ```
   $ sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \
   && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \
   && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb
   ```

**중요**  
AMI에 이미 최신 EFA 설치 관리자가 포함되어 있는 경우 5단계를 건너뜁니다.

## 5단계: EFA 소프트웨어 설치
<a name="nixl-start-base-enable"></a>

인스턴스에서 EFA를 지원하는 데 필요한 EFA 지원 커널, EFA 드라이버 및 Libfabric 스택을 설치합니다.

**EFA 소프트웨어를 설치하려면**

1. 시작한 인스턴스에 연결합니다. 자세한 내용은 [SSH를 사용하여 Linux 인스턴스에 연결](connect-to-linux-instance.md) 섹션을 참조하세요.

1. EFA 소프트웨어 설치 파일을 다운로드합니다. 소프트웨어 설치 파일은 압축 tarball(`.tar.gz`) 파일로 패키징되어 있습니다. 최신 *안정* 버전을 다운로드하려면 다음 명령을 사용하십시오.

   ```
   $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz
   ```

1. 압축 `.tar.gz` 파일에서 파일을 추출하고, tarball을 삭제한 다음, 추출된 디렉터리로 이동합니다.

   ```
   $ tar -xf aws-efa-installer-1.47.0.tar.gz && rm -rf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer
   ```

1. EFA 소프트웨어 설치 스크립트를 실행합니다.

   ```
   $ sudo ./efa_installer.sh -y
   ```

   **Libfabric**은 `/opt/amazon/efa` 디렉터리에 설치됩니다.

1. EFA 설치 프로그램에서 인스턴스를 재부팅하라는 메시지를 표시하면 인스턴스를 재부팅한 다음 인스턴스에 다시 연결합니다. 그렇게 하지 않으면 인스턴스에서 로그아웃한 다음 다시 로그인하여 설치를 완료합니다.

1. EFA 소프트웨어 구성 요소가 성공적으로 설치되었는지 확인합니다.

   ```
   $ fi_info -p efa -t FI_EP_RDM
   ```

   이 명령은 Libfabric EFA 인스턴스에 대한 정보를 반환합니다. 다음은 해당 명령 출력을 보여주는 예제입니다.
   + `p3dn.24xlarge` 및 단일 네트워크 인터페이스

     ```
     provider: efa
     fabric: EFA-fe80::94:3dff:fe89:1b70
     domain: efa_0-rdm
     version: 2.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```
   + `p4d.24xlarge` 및 `p5.48xlarge`와 여러 네트워크 인터페이스

     ```
     provider: efa
     fabric: EFA-fe80::c6e:8fff:fef6:e7ff
     domain: efa_0-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c34:3eff:feb2:3c35
     domain: efa_1-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::c0f:7bff:fe68:a775
     domain: efa_2-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     provider: efa
     fabric: EFA-fe80::ca7:b0ff:fea6:5e99
     domain: efa_3-rdm
     version: 111.0
     type: FI_EP_RDM
     protocol: FI_PROTO_EFA
     ```

## 6단계: NIXL 설치
<a name="nixl-start-base-nixl"></a>

NIXL을 설치합니다. NIXL에 대한 자세한 내용은 [NIXL 리포지토리](https://github.com/ai-dynamo/nixl)를 참조하세요.

------
#### [ Pre-built distributions ]

**PyPI를 사용하여 NIXL을 설치하려면**

1. 필요한 종속 항목을 설치합니다.

   ```
   $ sudo apt install pip
   ```

1. NIXL을 설치합니다.

   ```
   $ pip install nixl
   ```

------
#### [ Build from source ]

**소스에서 NIXL 빌드 및 설치를 위해**

1. 필요한 종속 항목을 설치합니다.

   ```
   $ sudo apt install cmake pkg-config meson pybind11-dev libaio-dev nvidia-cuda-toolkit pip libhwloc-dev \
   && pip install meson ninja pybind11
   ```

1. 홈 디렉터리로 이동합니다.

   ```
   $ cd $HOME
   ```

1. 공식 NIXL 리포지토리를 인스턴스에 복제하고 복제된 로컬 리포지토리로 이동합니다.

   ```
   $ sudo git clone https://github.com/ai-dynamo/nixl.git && cd nixl
   ```

1. NIXL을 빌드 및 설치하고 Libfabric 설치 디렉터리의 경로를 지정합니다.

   ```
   $ sudo meson setup . nixl --prefix=/usr/local/nixl -Dlibfabric_path=/opt/amazon/efa
   $ cd nixl && sudo ninja && sudo ninja install
   ```

------

## 7단계: NIXL 벤치마크 설치 및 EFA 및 NIXL 구성 테스트
<a name="nixl-start-base-tests"></a>

NIXL 벤치마크를 설치하고 테스트를 실행하여 임시 인스턴스가 EFA 및 NIXL에 맞게 올바르게 구성되었는지 확인합니다. NIXL 벤치마크를 사용하면 NIXL이 제대로 설치되었고 예상대로 작동하는지 확인할 수 있습니다. 자세한 내용은 [nixlbench 리포지토리](https://github.com/ai-dynamo/nixl/tree/main/benchmark/nixlbench)를 참조하세요.

NIXL 벤치마크(nixlbench)는 클라이언트와 서버 간의 조정을 위해 ETCD가 필요합니다. NIXL에서 ETCD를 사용하려면 ETCD 서버 및 클라이언트와 ETCD CPP API가 필요합니다.

------
#### [ Build from Docker ]

**Docker를 사용하여 NIXL 벤치마크를 설치하고 테스트하려면**

1. 공식 NIXL 리포지토리를 인스턴스에 복제하고 nixlbench 빌드 디렉터리로 이동합니다.

   ```
   $ git clone https://github.com/ai-dynamo/nixl.git
   $ cd nixl/benchmark/nixlbench/contrib
   ```

1. 컨테이너를 빌드합니다.

   ```
   $ ./build.sh
   ```

   Docker 빌드 옵션에 대한 자세한 내용은 [nixlbench 리포지토리](https://github.com/ai-dynamo/nixl/tree/main/benchmark/nixlbench)를 참조하세요.

1. 도커를 설치합니다.

   ```
   $ sudo apt install docker.io -y
   ```

1. 조정을 위해 ETCD 서버를 시작합니다.

   ```
   $ docker run -d --name etcd-server \
       -p 2379:2379 -p 2380:2380 \
       quay.io/coreos/etcd:v3.5.18 \
       /usr/local/bin/etcd \
       --data-dir=/etcd-data \
       --listen-client-urls=http://0.0.0.0:2379 \
       --advertise-client-urls=http://0.0.0.0:2379 \
       --listen-peer-urls=http://0.0.0.0:2380 \
       --initial-advertise-peer-urls=http://0.0.0.0:2380 \
       --initial-cluster=default=http://0.0.0.0:2380
   ```

1. ETCD 서버가 실행 중인지 확인합니다.

   ```
   $ curl -L http://localhost:2379/health
   ```

   예상 결과:

   ```
   {"health":"true"}
   ```

1. 인스턴스에 대해 두 개의 터미널을 엽니다. 두 개의 터미널 모두에서 다음 명령을 실행하여 설치를 확인합니다. 이 명령은 동일한 인스턴스에서 ETCD 서버를 사용하고, 백엔드로 Libfabric을 사용하며, GPU 메모리를 사용하여 작동합니다.

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM \
       --target_seg_type VRAM
   ```
**참고**  
GPU가 아닌 인스턴스에는 `VRAM` 대신 `DRAM` 값을 사용합니다.

------
#### [ Build from source ]

**중요**  
6단계에 **소스에서 빌드**를 선택한 경우에만 이 탭을 따르세요.

**NIXL 벤치마크를 설치하려면**

1. 필요한 시스템 종속 항목을 설치합니다.

   ```
   $ sudo apt install libgflags-dev
   ```

1. ETCD 서버 및 클라이언트를 설치합니다.

   ```
   $ sudo apt install -y etcd-server etcd-client
   ```

1. ETCD CPP API를 설치합니다.

   1. ETCD CPP API에 필요한 종속성을 설치합니다.

      ```
      $ sudo apt install libboost-all-dev libssl-dev libgrpc-dev libgrpc++-dev libprotobuf-dev protobuf-compiler-grpc libcpprest-dev
      ```

   1. ETCD CPP API를 복제하고 설치합니다.

      ```
      $ cd $HOME
      $ git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
      $ cd etcd-cpp-apiv3
      $ mkdir build && cd build
      $ cmake ..
      $ sudo make -j$(nproc) && sudo make install
      ```

1. nixlbench를 빌드하고 설치합니다.

   ```
   $ sudo meson setup . $HOME/nixl/benchmark/nixlbench -Dnixl_path=/usr/local/nixl/
   $ sudo ninja && sudo ninja install
   ```

**EFA 및 NIXL 구성을 테스트하려면**

1. 인스턴스에서 ETCD 서버를 시작합니다.

   ```
   $ etcd --listen-client-urls "http://0.0.0.0:2379" \
       --advertise-client-urls "http://localhost:2379" &
   ```

1. ETCD 서버가 실행 중인지 확인합니다.

   ```
   $ curl -L http://localhost:2379/health
   ```

   예상 결과:

   ```
   {"health":"true"}
   ```

1. 인스턴스에 대해 두 개의 터미널을 엽니다. 두 터미널 모두에서 다음 단계를 완료하여 nixlbench를 실행합니다.

   1. nixlbench가 설치된 디렉터리로 이동합니다.

      ```
      $ cd /usr/local/nixlbench/bin/
      ```

   1. 테스트를 실행하고 백엔드, ETCD 서버의 주소 및 이니시에이터 세그먼트 유형을 지정합니다. 다음 명령은 동일한 인스턴스에서 ETCD 서버를 사용하고, 백엔드로 Libfabric을 사용하며, GPU 메모리를 사용하여 작동합니다. 이 환경 변수는 다음을 구성합니다.
      + `NIXL_LOG_LEVEL=INFO` - 세부 디버깅 출력을 사용합니다. 오류 메시지만 수신하도록 `WARN`을 지정할 수도 있습니다.
      + `LD_LIBRARY_PATH` - NIXL 라이브러리의 경로를 설정합니다.

      NIXL 벤치마크 인수에 대한 자세한 내용은 공식 nixlbench 리포지토리의 [NIXLbench README](https://github.com/ai-dynamo/nixl/blob/main/benchmark/nixlbench/README.md)를 참조하세요.

      ```
      $ export NIXL_LOG_LEVEL=INFO
      $ export LD_LIBRARY_PATH=/usr/local/nixl/lib/$(gcc -dumpmachine):$LD_LIBRARY_PATH
      
      $ nixlbench --etcd-endpoints 'http://localhost:2379' \
          --backend 'LIBFABRIC' \
          --initiator_seg_type 'VRAM' \
          --target_seg_type 'VRAM'
      ```
**참고**  
GPU가 아닌 인스턴스에는 `VRAM` 대신 `DRAM` 값을 사용합니다.

------

## 8단계: 기계 학습 애플리케이션 설치
<a name="nixl-start-base-app"></a>

기계 학습 애플리케이션을 임시 인스턴스에 설치합니다. 설치 절차는 기계 학습 애플리케이션에 따라 다릅니다.

**참고**  
설치 지침은 기계 학습 애플리케이션의 설명서를 참조하세요.

## 9단계: EFA 및 NIXL 지원 AMI 생성
<a name="nixl-start-base-ami"></a>

필수 소프트웨어 구성 요소를 설치한 뒤 AMI를 사용하여 EFA 사용 인스턴스를 재사용하고 시작합니다.

**임시 인스턴스에서 AMI를 생성하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택하고 [**작업(Actions)**], [**이미지(Image)**], [**이미지 생성(Create image)**]을 선택합니다.

1. [**이미지 생성(Create image)**]에서 다음을 수행합니다.

   1. [**이미지 이름(Image name)**]에 AMI를 설명하는 이름을 입력합니다.

   1. (선택 사항) [**이미지 설명(Image description)**]에 AMI의 용도에 대한 간략한 설명을 입력합니다.

   1. **이미지 생성(Create image)**을 선택합니다.

1. 탐색 창에서 **AMI**를 선택합니다.

1. 목록에서 생성한 AMI를 찾습니다. 상태가 `pending`에서 `available`로 바뀔 때까지 기다린 후 다음 단계를 계속합니다.

## 10단계: 임시 인스턴스 종료
<a name="nixl-start-base-terminate"></a>

이 단계에서는 시작한 임시 인스턴스가 더 이상 필요하지 않습니다. 추가 요금이 발생하지 않도록 해당 인스턴스를 종료할 수 있습니다.

**임시 인스턴스 종료**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 생성한 임시 인스턴스를 선택하고 **작업(Actions)**, **인스턴스 상태(Instance state)**, **인스턴스 종료(Terminate instance)**를 선택합니다.

1. 확인 메시지가 나타나면 **종료(Terminate)**를 선택합니다.

## 11단계: EFA 및 NIXL 지원 인스턴스 시작
<a name="nixl-start-base-cluster"></a>

**9단계**에서 생성한 EFA 지원 AMI와 **1단계**에서 생성한 EFA 지원 보안 그룹을 사용하여 EFA 및 NIXL 지원 인스턴스를 시작합니다.

**EFA 및 NIXL 지원 인스턴스를 시작하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **Instances**(인스턴스)를 선택한 다음에 **Launch Instances**(인스턴스 시작)를 선택하여 새 인스턴스 시작 마법사를 엽니다.

1. (*선택 사항*)**이름 및 태그(Name and tags)** 섹션에서 인스턴스의 이름(예: `EFA-instance`)을 제공합니다. 이름은 인스턴스에 리소스 태그(`Name=EFA-instance`)로 할당됩니다.

1. **애플리케이션 및 OS 이미지(Application and OS Images)** 섹션에서 **내 AMI(My AMIs)**를 선택한 다음에 이전 단계에서 생성한 AMI를 선택합니다.

1. **인스턴스 유형** 섹션에서 지원되는 인스턴스 유형을 선택합니다.

1. **키 페어(Key pair)** 섹션에서 인스턴스에 사용할 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 섹션에서 **편집(Edit)**을 선택하고 다음과 같이 수행합니다.

   1. **서브넷(Subnet)**에서 인스턴스를 시작할 서브넷을 선택합니다. 서브넷을 선택하지 않으면 EFA에 대해 인스턴스를 활성화할 수 없습니다.

   1. **방화벽(보안 그룹)**의 경우, **기존 보안 그룹 선택**을 선택한 다음 **1단계**에서 생성한 보안 그룹을 선택합니다.

   1. **고급 네트워크 구성** 섹션을 확장합니다.

      **네트워크 인터페이스 1**에서 **네트워크 카드 인덱스 = 0**, **디바이스 인덱스 = 0** 및 **인터페이스 유형 = ENA 포함 EFA**를 선택합니다.

      (*선택 사항*) `p4d.24xlarge` 또는 `p5.48xlarge`와 같은 다중 카드 인스턴스 유형을 사용하는 경우, 필요한 추가 네트워크 인터페이스마다 **네트워크 인터페이스 추가**를 선택하고 **네트워크 카드 인덱스**에서 다음 미사용 인덱스를 선택한 다음, **디바이스 인덱스 = 1** 및 **인터페이스 유형 = ENA 포함 EFA** 또는 **EFA 전용**을 선택합니다.

1. (*선택 사항*) **스토리지(Storage)** 섹션에서 필요에 따라 볼륨을 구성합니다.

1. 오른쪽의 **요약(Summary)** 패널에서 **인스턴스 개수(Number of instances)**의 경우 시작하려는 EFA 사용 인스턴스 개수를 입력한 다음에 **인스턴스 시작(Launch instance)**을 선택합니다.

## 12단계: 암호 없는 SSH 활성화
<a name="nixl-start-base-passwordless"></a>

클러스터의 모든 인스턴스에서 실행하도록 애플리케이션을 활성화하려면 리더 노드에서 멤버 노드로의 암호 없는 SSH 액세스를 사용해야 합니다. 리더 노드는 애플리케이션을 실행할 인스턴스입니다. 클러스터의 나머지 인스턴스는 멤버 노드입니다,

**클러스터의 인스턴스 간에 암호 없는 SSH를 사용하려면**

1. 클러스터의 인스턴스 1개를 리더 노드로 선택하고 연결합니다.

1. `strictHostKeyChecking`을 비활성화하고 리더 노드에서 `ForwardAgent`를 활성화합니다. 원하는 텍스트 편집기를 사용하여 `~/.ssh/config`를 열고 다음을 추가합니다.

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. RSA 키 페어 생성:

   ```
   $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
   ```

   키 페어는 `$HOME/.ssh/` 디렉터리에 생성됩니다.

1. 리더 노드에서 프라이빗 키의 사용 권한을 변경합니다.

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/id_rsa.pub`를 열고 키를 추가합니다.

1. 클러스터의 각 멤버 노드에 대해 다음을 수행합니다.

   1. 인스턴스에 연결합니다.

   1. 원하는 텍스트 편집기를 사용하여 `~/.ssh/authorized_keys`를 열고 앞에서 복사한 퍼블릭 키를 추가합니다.

1. 암호 없는 SSH가 예상대로 작동하는지 테스트하려면 리더 노드에 연결하고 다음 명령을 실행합니다.

   ```
   $ ssh member_node_private_ip
   ```

   키 또는 암호를 입력하라는 메시지가 표시되지 않은 상태에서 멤버 노드에 연결해야 합니다.

**중요**  
7단계를 따른 경우에만 13단계를 따릅니다.

## 13단계: 인스턴스 간 EFA 및 NIXL 구성 테스트
<a name="nixl-start-base-test-multi"></a>

EFA 및 NIXL에 맞게 인스턴스가 올바르게 구성되었는지 확인하기 위해 테스트를 실행합니다.

------
#### [ Build from Docker ]

**Docker를 사용하여 인스턴스 간 EFA 및 NIXL 구성을 테스트하려면**

1. nixlbench 벤치마크를 실행할 호스트 2개를 선택합니다. 첫 번째 호스트의 IP 주소를 메타데이터 교환을 위한 ETCD 서버 IP로 사용합니다.

1. 호스트 1에서 ETCD 서버를 시작합니다.

   ```
   $ docker run -d --name etcd-server \
       -p 2379:2379 -p 2380:2380 \
       quay.io/coreos/etcd:v3.5.18 \
       /usr/local/bin/etcd \
       --data-dir=/etcd-data \
       --listen-client-urls=http://0.0.0.0:2379 \
       --advertise-client-urls=http://0.0.0.0:2379 \
       --listen-peer-urls=http://0.0.0.0:2380 \
       --initial-advertise-peer-urls=http://0.0.0.0:2380 \
       --initial-cluster=default=http://0.0.0.0:2380
   ```

1. ETCD 서버가 실행 중인지 확인합니다.

   ```
   $ curl -L http://localhost:2379/health
   ```

   ```
   {"health":"true"}
   ```

1. 호스트 1에서 nixlbench 벤치마크를 실행합니다.

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

1. 호스트 2에서 nixlbench 벤치마크를 실행합니다.

   ```
   $ docker run -it --gpus all --network host nixlbench:latest \
       nixlbench --etcd_endpoints http://ETCD_SERVER_IP:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

------
#### [ Build from source ]

**중요**  
6단계에 **소스에서 빌드**를 선택한 경우에만 이 탭을 따르세요.

**인스턴스 간 EFA 및 NIXL 구성을 테스트하려면**

1. nixlbench 벤치마크를 실행할 호스트 2개를 선택합니다. 첫 번째 호스트의 IP 주소를 메타데이터 교환을 위한 ETCD 서버 IP로 사용합니다.

1. 호스트 1에서 ETCD 서버를 시작합니다.

   ```
   $ etcd --listen-client-urls "http://0.0.0.0:2379" \
       --advertise-client-urls "http://localhost:2379" &
   ```

1. ETCD 서버가 실행 중인지 확인합니다.

   ```
   $ curl -L http://localhost:2379/health
   ```

   ```
   {"health":"true"}
   ```

1. 호스트 1에서 nixlbench 벤치마크를 실행합니다.

   ```
   $ export NIXL_LOG_LEVEL=INFO
   $ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
   
   $ nixlbench \
       --etcd-endpoints http://localhost:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

1. 호스트 2에서 nixlbench 벤치마크를 실행합니다.

   ```
   $ export NIXL_LOG_LEVEL=INFO
   $ export LD_LIBRARY_PATH=$HOME/nixl/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
   
   $ nixlbench \
       --etcd-endpoints http://ETCD_SERVER_IP:2379 \
       --backend LIBFABRIC \
       --initiator_seg_type VRAM
   ```

------

## 14단계: vLLM을 통해 분해된 추론 서비스 테스트(*선택 사항*)
<a name="nixl-start-base-serve"></a>

NIXL이 설치되면 LLM 추론을 통해 NIXL을 사용하고 vLLM, SGLang 및 TensorRT-LLM과 같은 프레임워크를 제공할 수 있습니다.

**vLLM을 사용하여 추론 워크로드를 처리하려면**

1. vLLM을 설치합니다.

   ```
   $ pip install vllm
   ```

1. NIXL로 vLLM 서버를 시작합니다. 다음 샘플 명령은 NIXL 핸드셰이크 연결, KV 커넥터, KV 역할 및 전송 백엔드를 위한 프리필(생산자) 인스턴스 하나와 디코딩(소비자) 인스턴스 하나를 생성합니다. 자세한 예제 및 스크립트는 [NIXLConnector 사용 설명서](https://github.com/vllm-project/vllm/blob/2d977a7a9ead3179fde9ed55d69393ef7b6cec47/docs/features/nixl_connector_usage.md)를 참조하세요.

   EFA에서 NIXL을 사용하려면 설정 및 사용 사례에 따라 환경 변수를 설정합니다.
   + 생산자(프리필러) 구성

     ```
     $ vllm serve your-application \
         --port 8200 \
         --enforce-eager \
         --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'
     ```
   + 소비자(디코더) 구성

     ```
     $ vllm serve your-application \
         --port 8200 \
         --enforce-eager \
         --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'
     ```

   위의 샘플 구성은 다음을 설정합니다.
   + `kv_role` \$1 `kv_both`: 커넥터가 생산자와 소비자 역할을 모두 할 수 있는 대칭 기능을 활성화합니다. 이를 통해 역할 구분이 미리 결정되지 않는 실험 설정 및 시나리오에 유연성을 제공할 수 있습니다.
   + `kv_buffer_device` \$1 `cuda`: GPU 메모리를 사용할 수 있습니다.
   + NIXL 백엔드를 `LIBFABRIC`에 연결하여 NIXL 트래픽이 EFA를 통과할 수 있도록 합니다.

# 여러 네트워크 카드를 사용하여 Amazon EC2 인스턴스의 네트워크 대역폭 극대화
<a name="efa-acc-inst-types"></a>

EFA를 지원하는 많은 인스턴스 유형에는 여러 네트워크 카드도 있습니다. 자세한 내용은 [네트워크 카드](using-eni.md#network-cards) 섹션을 참조하세요. 이러한 인스턴스 유형 중 하나에서 EFA를 사용할 계획인 경우 다음과 같은 기본 구성을 권장합니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 `0`, 디바이스 인덱스 `0`)에 대해 ENA 인터페이스를 생성합니다. EFA 전용 네트워크 인터페이스를 기본 네트워크 인터페이스로 사용할 수 없습니다.
+ 네트워크 카드 인덱스 0이 EFA를 지원하는 경우 네트워크 카드 인덱스 `0`, 디바이스 인덱스 `1`에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.
+ 추가 네트워크 인터페이스마다 EFA 전용 네트워크 인터페이스의 경우 다음 미사용 네트워크 카드 인덱스인 디바이스 인덱스 `0`을 사용하고, ENA 네트워크 인터페이스의 경우 디바이스 인덱스 `1`을 사용합니다. 이는 사용 사례(예: ENA 대역폭 요구 사항 또는 IP 주소 공간)에 따라 결정됩니다. 사용 사례 예시는 [P5 및 P5e 인스턴스에 대한 EFA 구성](#efa-for-p5)을 참조하세요.

**참고**  
P5 인스턴스는 최대 네트워크 대역폭을 활성화하려면 네트워크 인터페이스를 특정 방식으로 구성해야 합니다. 자세한 내용은 [P5 및 P5e 인스턴스에 대한 EFA 구성](#efa-for-p5) 섹션을 참조하세요.

다음 예시에서는 이러한 권장 사항에 따라 인스턴스를 시작하는 방법을 보여줍니다.

------
#### [ Instance launch ]

**인스턴스 시작 마법사를 사용하여 인스턴스를 시작 중에 EFA를 지정하려면**

1. **네트워크 설정** 섹션에서 **편집**을 선택합니다.

1. **고급 네트워크 구성**을 확장합니다.

1. 기본 네트워크 인터페이스(네트워크 카드 인덱스 `0`, 디바이스 인덱스 `0`)에 대해 ENA 인터페이스를 생성합니다. EFA 전용 네트워크 인터페이스를 기본 네트워크 인터페이스로 사용할 수 없습니다.

1. 네트워크 카드 인덱스 0이 EFA를 지원하는 경우 네트워크 카드 인덱스 `0`, 디바이스 인덱스 `1`에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.

1. 추가 네트워크 인터페이스마다 EFA 전용 네트워크 인터페이스의 경우 다음 미사용 네트워크 카드 인덱스인 디바이스 인덱스 `0`을 사용하고, ENA 네트워크 인터페이스의 경우 디바이스 인덱스 `1`을 사용합니다. 이는 사용 사례(예: ENA 대역폭 요구 사항 또는 IP 주소 공간)에 따라 결정됩니다. 사용 사례 예시는 [P5 및 P5e 인스턴스에 대한 EFA 구성](#efa-for-p5)을 참조하세요.

**[run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 명령을 사용하여 인스턴스 시작 중에 EFA를 지정하려면**  
`--network-interfaces`에서 필요한 네트워크 인터페이스의 수를 지정합니다. 기본 네트워크 인터페이스에서 `NetworkCardIndex=0`, `DeviceIndex=0`, `InterfaceType=interface`를 지정합니다. 네트워크 카드 인덱스 0이 EFA를 지원하는 경우 `NetworkCardIndex=0`, `DeviceIndex=1` 및 `InterfaceType=efa-only`를 지정합니다. 추가 네트워크 인터페이스에서 `NetworkCardIndex`에 대해 다음 미사용 인덱스(`InterfaceType=efa-only`인 경우 `DeviceIndex=0`, `InterfaceType=interface`인 경우 `DeviceIndex=1`)를 지정합니다.

다음 예시 명령 조각은 32개의 EFA 디바이스와 1개의 ENA 디바이스가 포함된 요청을 보여줍니다.

```
$ aws ec2 run-instances \
 --instance-type p5.48xlarge \
 --count 1 \
 --key-name key_pair_name \
 --image-id ami-0abcdef1234567890 \
 --network-interfaces "NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=0,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=17,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=18,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=19,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=20,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=21,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=22,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=23,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=24,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=25,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=26,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=27,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=28,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=29,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=30,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=31,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
...
```

------
#### [ Launch templates ]

**Amazon EC2 콘솔을 사용하여 시작 템플릿에 EFA를 추가하려면**

1. **네트워크 설정** 섹션에서 **고급 네트워크 구성**을 확장합니다.

1. 기본 네트워크 인터페이스(네트워크 카드 인덱스 `0`, 디바이스 인덱스 `0`)에 대해 ENA 인터페이스를 생성합니다. EFA 전용 네트워크 인터페이스를 기본 네트워크 인터페이스로 사용할 수 없습니다.

1. 네트워크 카드 인덱스 0이 EFA를 지원하는 경우 네트워크 카드 인덱스 `0`, 디바이스 인덱스 `1`에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.

1. 추가 네트워크 인터페이스마다 EFA 전용 네트워크 인터페이스의 경우 다음 미사용 네트워크 카드 인덱스인 디바이스 인덱스 `0`을 사용하고, ENA 네트워크 인터페이스의 경우 디바이스 인덱스 `1`을 사용합니다. 이는 사용 사례(예: ENA 대역폭 요구 사항 또는 IP 주소 공간)에 따라 결정됩니다. 사용 사례 예시는 [P5 및 P5e 인스턴스에 대한 EFA 구성](#efa-for-p5)을 참조하세요.

**[create-launch-template](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html) 명령을 사용하여 시작 템플릿에 EFA를 추가하려면**  
`NetworkInterfaces`에서 필요한 네트워크 인터페이스의 수를 지정합니다. 기본 네트워크 인터페이스에서 `NetworkCardIndex=0`, `DeviceIndex=0`, `InterfaceType=interface`를 지정합니다. 네트워크 카드 인덱스 0이 EFA를 지원하는 경우 `NetworkCardIndex=0`, `DeviceIndex=1` 및 `InterfaceType=efa-only`를 지정합니다. 추가 네트워크 인터페이스에서 `NetworkCardIndex`에 대해 다음 미사용 인덱스(`InterfaceType=efa-only`인 경우 `DeviceIndex=0`, `InterfaceType=interface`인 경우 `DeviceIndex=1`)를 지정합니다.

다음 코드 조각은 사용 가능한 32개의 네트워크 인터페이스 중 3개의 네트워크 인터페이스를 사용하는 예를 보여줍니다.

```
"NetworkInterfaces":[
{
  "NetworkCardIndex":0,
  "DeviceIndex":0,
  "InterfaceType": "interface",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 0,
  "DeviceIndex": 1,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 1,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 2,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
},
{
  "NetworkCardIndex": 3,
  "DeviceIndex": 0,
  "InterfaceType": "efa-only",
  "AssociatePublicIpAddress":false,
  "Groups":[
    "security_group_id"
  ],
  "DeleteOnTermination":true
}
...
```

------

## P5 및 P5e 인스턴스에 대한 EFA 구성
<a name="efa-for-p5"></a>

`p5.48xlarge` 및 `p5e.48xlarge` 인스턴스는 32개의 네트워크 카드를 지원하며 총 네트워크 대역폭 용량은 3,200Gbps로, 이 중 최대 800Gbps를 IP 네트워크 트래픽에 활용할 수 있습니다. EFA와 IP 네트워크 트래픽은 동일한 기본 리소스를 공유하므로 한 쪽에서 대역폭을 사용하면 다른 쪽에서 사용할 수 있는 대역폭이 줄어듭니다. 즉, 총 대역폭이 3,200Gbps를 초과하지 않으며 IP 대역폭이 800Gbps를 초과하지 않는 한 EFA 트래픽과 IP 트래픽 간에 네트워크 대역폭을 원하는 대로 조합하여 배포할 수 있습니다. 예를 들어 IP 대역폭에 400Gbps를 사용하는 경우 동시에 최대 2,800Gbps의 EFA 대역폭을 구현할 수 있습니다.

**사용 사례 1: IP 주소 저장 및 잠재적 Linux IP 문제 방지**

이 구성은 하나의 프라이빗 IP 주소를 통해 최대 3,200Gbps의 EFA 네트워킹 대역폭과 최대 100Gbps의 IP 네트워킹 대역폭을 제공합니다. 이 구성은 인스턴스에 여러 네트워크 인터페이스가 있는 경우 발생할 수 있는 퍼블릭 IP 주소의 자동 할당 거부 및 IP 라우팅 문제(호스트 이름과 IP 주소 매핑 문제 및 소스 IP 주소 불일치)와 같은 잠재적인 Linux IP 문제를 방지하는 데도 도움이 됩니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)의 경우 ENA 인터페이스를 사용합니다.
+ 네트워크 카드 인덱스 0, 디바이스 인덱스 1에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.
+ 나머지 네트워크 인터페이스(네트워크 카드 인덱스 1\$131, 디바이스 인덱스 0)에는 EFA 전용 네트워크 인터페이스를 사용합니다.

**사용 사례 2: 최대 EFA 및 IP 네트워크 대역폭**

이 구성은 8개의 프라이빗 IP 주소를 통해 최대 3,200Gbps의 EFA 네트워킹 대역폭과 최대 800Gbps의 IP 네트워킹 대역폭을 제공합니다. 이 구성에서는 퍼블릭 IP 주소를 자동 할당할 수 없습니다. 하지만 시작한 후 인터넷 연결을 위해 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)에 탄력적 IP 주소를 연결할 수 있습니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)의 경우 ENA 네트워크 인터페이스를 사용합니다.
+ 나머지 인터페이스의 경우 다음을 수행합니다.
  + 네트워크 카드 인덱스 0 디바이스 인덱스 1에서 EFA 전용 네트워크 인터페이스를 지정하고, 네트워크 카드 인덱스 1, 2, 3의 경우 디바이스 인덱스 0을 사용합니다.
  + 다음 네트워크 카드 인덱스 하위 집합 **각각에** 1개의 ENA 네트워크 인터페이스와 4개의 EFA 전용 네트워크 인터페이스를 지정하고, ENA 네트워크 인터페이스에는 디바이스 인덱스 1을 사용하고 EFA 전용 네트워크 인터페이스에는 디바이스 인덱스 0을 사용합니다.
    + [4,5,6,7]
    + [8,9,10,11]
    + [12,13,14,15]
    + [16,17,18,19]
    + [20,21,22,23]
    + [24,25,26,27]
    + [28,29,30,31]

다음 예시에서는 이 구성을 보여줍니다.

```
$ aws --region $REGION ec2 run-instances \
 --instance-type p5.48xlarge \
 --count 1 \
 --key-name key_pair_name \
 --image-id ami_id \
 --network-interfaces "NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=0,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=17,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=18,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=19,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=20,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=20,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=21,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=22,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=23,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=24,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=24,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=25,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=26,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=27,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=28,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=28,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=29,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=30,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=31,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
...
```

## P6-B200 인스턴스에 대한 EFA 구성
<a name="efa-for-p6-b200"></a>

P6-B200 인스턴스의 총 네트워크 대역폭 용량은 3,200Gbps이며, 이 중 최대 1600Gbps를 IP 네트워크 트래픽에 활용할 수 있습니다. 8개의 GPU와 8개의 네트워크 카드가 있으며, 각 네트워크 카드는 최대 400Gbps의 EFA 대역폭과 200Gbps의 ENA 대역폭을 지원합니다. EFA와 ENA 트래픽은 동일한 기본 리소스를 공유하므로 한 쪽에서 대역폭을 사용하면 다른 쪽에서 사용할 수 있는 대역폭이 줄어듭니다.

**사용 사례 1: IP 주소 저장**

이 구성은 인스턴스당 하나 이상의 프라이빗 IP 주소를 사용하며, 최대 3,200Gbps의 EFA 대역폭과 200Gbps의 ENA 대역폭을 지원합니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)에 ENA 인터페이스를 사용합니다.
+ 네트워크 카드 인덱스 0, 디바이스 인덱스 1에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.
+ 나머지 7개 네트워크 카드(네트워크 카드 인덱스 1\$17, 디바이스 인덱스 0)에 EFA 전용 네트워크 인터페이스를 사용합니다.

**사용 사례 2: 최대 EFA 및 ENA 대역폭**

이 구성은 인스턴스당 최소 8개의 프라이빗 IP 주소를 사용하며, 최대 3,200Gbps의 EFA 대역폭과 1,600Gbps의 ENA 대역폭을 지원합니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)에 ENA 인터페이스를 사용합니다.
+ 네트워크 카드 인덱스 0, 디바이스 인덱스 1에 대해 EFA 전용 네트워크 인터페이스를 생성합니다.
+ 나머지 7개의 네트워크 카드(네트워크 카드 인덱스 1\$17)에 대해 디바이스 인덱스 0에 EFA 전용 네트워크 인터페이스를 생성하고 디바이스 인덱스 1에 ENA 네트워크 인터페이스를 생성합니다.

## P6e-GB200 인스턴스에 대한 EFA 구성
<a name="efa-for-p6e"></a>

P6e-GB200 인스턴스는 네트워크 카드 최대 17개로 구성할 수 있습니다. 다음 이미지는 P6e-GB200 인스턴스의 물리적 네트워크 인터페이스 카드(NIC) 레이아웃과 네트워크 카드 인덱스(NCI)의 매핑을 보여줍니다.

![\[P6e-GB200 인스턴스의 물리적 네트워크 인터페이스 카드(NIC)및 네트워크 카드 인덱스(NCI) 매핑입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/p6e.png)


기본 NCI(인덱스 0)는 최대 100Gbps의 ENA 대역폭을 지원합니다. [1, 3, 5, 7, 9, 11, 13, 15] 인덱스가 있는 NCI는 EFA 전용 네트워크 인터페이스와 400Gbps EFA 대역폭을 지원합니다. [2, 4, 6, 8, 10, 12, 14, 16] 인덱스가 있는 NCI는 최대 200Gbps ENA 또는 EFA 대역폭을 지원합니다.

다음 그룹의 NCI는 호스트에서 기본 물리적 NIC를 공유합니다.
+ [1 및 2]
+ [3 및 4]
+ [5 및 6]
+ [7 및 8]
+ [9 및 10]
+ [11 및 12]
+ [13 및 14]
+ [15 및 16]

각 물리적 NIC는 최대 400Gbps의 대역폭을 지원합니다. 이 그룹의 NCI는 동일한 기본 물리적 NIC를 공유하므로 한 그룹에서 사용하는 대역폭은 다른 그룹에서 사용할 수 있는 대역폭을 줄입니다. 예를 들어 NCI 2가 200Gbps의 ENA 대역폭을 사용하는 경우 NCI 1은 동시에 최대 200Gbps의 EFA 대역폭을 사용할 수 있습니다.

호스트에 있는 각 기본 GPU는 다음 NCI 쌍을 통해 트래픽을 직접 전송할 수 있습니다.
+ [1 및 3]
+ [5 및 7]
+ [9 및 11]
+ [13 및 15]

각 GPU는 최대 400Gbps의 EFA 대역폭을 지원합니다. 이 그룹의 네트워크 카드는 동일한 GPU를 공유하므로 한 그룹에서 사용하는 대역폭은 다른 그룹에서 사용할 수 있는 대역폭을 줄입니다. 예를 들어 NCI 1이 200Gbps의 EFA 대역폭을 사용하는 경우 NCI 3은 동시에 최대 200Gbps의 EFA 대역폭을 사용할 수 있습니다. 따라서 최대 EFA 성능을 달성하려면 **다음 중 하나**를 수행하여 총 1,600Gbps의 EFA 대역폭을 달성하는 것이 좋습니다.
+ 네트워크 인터페이스당 400Gpbs(*400Gbps x EFA 네트워크 인터페이스 4개*)를 달성하려면 각 그룹에서 NCI 하나에만 EFA 전용 네트워크 인터페이스를 추가합니다.
+ 네트워크 인터페이스당 200Gpbs(*200Gbps x EFA 네트워크 인터페이스 8개*)를 달성하려면 각 그룹에서 각 NCI에 EFA 전용 네트워크 인터페이스를 추가합니다.

예를 들어 다음 구성은 각 NCI 그룹의 한 EFA 전용 네트워크 인터페이스를 사용하여 최대 1,600Gbps의 EFA 대역폭을 제공하고 기본 NCI(인덱스 0)만 사용하여 최대 100Gbps의 ENA 네트워킹 대역폭을 제공합니다.
+ 기본 NCI(네트워크 카드 인덱스 0, 디바이스 인덱스 0)의 경우 ENA 네트워크 인터페이스를 사용합니다.
+ EFA 전용 네트워크 인터페이스를 다음에 추가합니다.
  + NCI 1, 디바이스 인덱스 0
  + NCI 5, 디바이스 인덱스 0
  + NCI 9, 디바이스 인덱스 0
  + NCI 13, 디바이스 인덱스 0

## P6-B300 인스턴스에 대한 EFA 구성
<a name="efa-for-p6-b300"></a>

P6-B300 인스턴스는 EFA 트래픽의 경우 최대 6,400Gbps, ENA 트래픽의 경우 최대 3,870Gbps의 총 네트워크 대역폭 용량을 제공합니다. 해당 인스턴스에는 8개의 GPU와 17개의 네트워크 카드가 탑재되어 있으며, 기본 네트워크 카드는 최대 350Gbps 대역폭을 지원하는 ENA 네트워크 인터페이스만 지원합니다. 보조 네트워크 카드는 최대 400Gbps의 EFA와 최대 220Gbps의 ENA 대역폭을 지원합니다. EFA와 ENA 트래픽은 동일한 기본 리소스를 공유하므로 한 쪽에서 대역폭을 사용하면 다른 쪽에서 사용할 수 있는 대역폭이 줄어듭니다.

![\[P6-B300 인스턴스의 물리적 네트워크 인터페이스 카드(NIC)및 네트워크 카드 인덱스(NCI) 매핑입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/p6-b300.png)


**사용 사례 1: IP 주소 저장**

이 구성은 인스턴스당 하나 이상의 프라이빗 IP 주소를 사용하며, 최대 6,400Gbps의 EFA 대역폭과 350Gbps의 ENA 대역폭을 지원합니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)의 경우 ENA 네트워크 인터페이스를 사용합니다.
+ 나머지 네트워크 카드(네트워크 카드 인덱스 1\$116, 디바이스 인덱스 0)에 EFA 전용 네트워크 인터페이스를 사용합니다.

```
--network-interfaces \
"NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only"
```

**사용 사례 2: 최대 EFA 및 ENA 대역폭**

이 구성은 인스턴스당 최소 17개의 프라이빗 IP 주소를 사용하며, 최대 6,400Gbps의 EFA 대역폭과 3,870Gbps의 ENA 대역폭을 지원합니다.
+ 기본 네트워크 인터페이스(네트워크 카드 인덱스 0, 디바이스 인덱스 0)의 경우 ENA 네트워크 인터페이스를 사용합니다.
+ 나머지 네트워크 카드에 대해 EFA 전용 인터페이스(네트워크 카드 인덱스 1\$116, 디바이스 인덱스 0)와 ENA 인터페이스(네트워크 카드 인덱스 1\$116, 디바이스 인덱스 1)를 생성합니다.

```
--network-interfaces \
"NetworkCardIndex=0,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=1,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=2,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=3,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=4,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=5,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=6,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=7,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=8,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=9,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=10,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=11,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=12,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=13,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=14,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=15,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=16,DeviceIndex=0,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=efa-only" \
"NetworkCardIndex=1,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=2,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=3,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=4,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=5,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=6,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=7,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=8,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=9,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=10,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=11,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=12,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=13,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=14,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=15,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface" \
"NetworkCardIndex=16,DeviceIndex=1,Groups=security_group_id,SubnetId=subnet_id,InterfaceType=interface"
```

# Elastic Fabric Adapter를 생성하여 Amazon EC2 인스턴스에 연결
<a name="create-efa"></a>

Amazon EC2의 다른 탄력적 네트워크 인터페이스와 마찬가지로 EFA를 생성하여 Amazon EC2 인스턴스에 연결할 수 있습니다. 그러나 탄력적 네트워크 인터페이스와 달리 EFA는 `running` 상태에서 인스턴스에 연결하거나 연결 해제할 수 없습니다.

**고려 사항**
+  EFA과 연결된 보안 그룹을 변경할 수 있습니다. OS 우회 기능을 사용하기 위해 EFA는 보안 그룹 자체 내의 모든 인바운드 및 아웃바운드 트래픽을 허용하는 보안 그룹에 구성되어야 합니다. 자세한 내용은 [1단계: EFA를 사용한 보안 그룹 준비](efa-start.md#efa-start-security) 섹션을 참조하세요.

  탄력적 네트워크 인터페이스와 연결된 보안 그룹을 변경한 것과 동일한 방법을 사용하여 EFA에 연결된 보안 그룹을 변경할 수 있습니다. 자세한 내용은 [네트워크 인터페이스 속성 수정](modify-network-interface-attributes.md) 섹션을 참조하세요.
+ 탄력적 네트워크 인터페이스에 IP 주소를 할당하는 것과 동일한 방법을 사용하여 EFA(ENA 포함 EFA) 네트워크 인터페이스에 탄력적 IP(IPv4) 및 IPv6 주소를 할당할 수 있습니다. 자세한 내용은 [IP 주소 관리](managing-network-interface-ip-addresses.md)를 참조하세요.

  EFA 전용 네트워크 인터페이스에는 IP 주소를 할당할 수 없습니다.

**Topics**
+ [EFA 생성](#efa-create)
+ [중지된 인스턴스에 EFA 연결](#efa-attach)
+ [인스턴스를 시작할 때 EFA 연결](#efa-launch)
+ [시작 템플릿에 EFA 추가](#efa-launch-template)

## EFA 생성
<a name="efa-create"></a>

VPC의 서브넷에 EFA를 생성할 수 있습니다. EFA는 일단 생성되고 나면 다른 서브넷으로 옮길 수 없으며 동일 가용 영역의 인스턴스에만 네트워크 인터페이스를 연결할 수 있습니다.

------
#### [ Console ]

**EFA(ENA 포함 EFA 또는 ENA 전용) 네트워크 인터페이스를 생성하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **네트워크 인터페이스(Network Interfaces)**를 선택한 후 **네트워크 인터페이스 생성(Create network interface)**을 선택합니다.

1. **설명**에 EFA를 설명하는 이름을 입력합니다.

1. **서브넷**에서 EFA를 생성하려는 서브넷을 선택합니다.

1. **인터페이스 유형**에서 다음 옵션 중 하나를 선택합니다.
   + **ENA 포함 EFA** - ENA 디바이스와 EFA 디바이스를 모두 지원하는 네트워크 인터페이스를 생성합니다.
   + **EFA 전용** - EFA 디바이스로만 네트워크 인터페이스를 생성합니다.

1. (ENA 포함 EFA에만 해당) 네트워크 인터페이스에 대한 IP 주소와 접두사 할당을 구성합니다. 선택한 서브넷에 따라 할당할 수 있는 IP 주소와 접두사의 유형이 달라집니다. IPv4 전용 서브넷의 경우 IPv4 IP 주소와 접두사만 할당할 수 있습니다. IPv6 전용 서브넷의 경우 IPv6 IP 주소와 접두사만 할당할 수 있습니다. 듀얼 스택 서브넷의 경우 IPv4 및 IPv6 IP 주소와 접두사를 모두 할당할 수 있습니다.
**참고**  
EFA 전용 네트워크 인터페이스에는 IP 주소를 할당할 수 없습니다.

   1. **프라이빗 IPv4 주소** 및/또는 **IPv6 주소**의 경우 **자동 할당**을 선택하여 Amazon EC2가 선택한 서브넷에서 IP 주소를 자동으로 할당하도록 하거나 **사용자 지정**을 선택하여 할당할 IP 주소를 수동으로 지정합니다.

   1. IPv6 주소를 할당하는 경우 선택적으로 **프라이머리 IPv6 IP 할당**을 활성화할 수 있습니다. 이렇게 하면 네트워크 인터페이스에 프라이머리 IPv6 글로벌 유니캐스트 주소(GUA)가 할당됩니다. 기본 IPv6 주소를 할당하면 인스턴스나 ENI에 대한 트래픽 중단을 방지할 수 있습니다. 자세한 내용은 [IPv6 주소](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#vpc-ipv6-addresses)를 참조하세요.

   1. **IPv4 접두사 위임** 및/또는 **IPv6 접두사 위임**의 경우 **자동 할당**을 선택하여 Amazon EC2가 서브넷의 CIDR 블록에서 접두사를 자동으로 할당하도록 하거나 **사용자 지정**을 선택하여 서브넷의 CIDR 블록에서 접두사를 수동으로 지정합니다. 접두사를 지정하면 AWS에서 해당 접두사가 다른 리소스에 이미 할당되지 않았는지 확인합니다. 자세한 내용은 [Amazon EC2 네트워크 인터페이스에 대한 접두사 위임](ec2-prefix-eni.md) 섹션을 참조하세요.

   1. (선택 사항) **유휴 연결 추적 제한 시간** 설정을 구성합니다. 자세한 내용은 [유휴 연결 추적 제한 시간](security-group-connection-tracking.md#connection-tracking-timeouts) 섹션을 참조하세요.
      + **TCP 설정 제한 시간** - 설정된 상태의 유휴 TCP 연결에 대한 제한 기간(초)입니다. 최솟값: 60초. 최댓값: 43만 2,000초(5일). 기본값: 43만 2,000초. 권장값: 43만 2,000초 미만.
      + **UDP 제한 시간** - 단일 방향 또는 단일 요청-응답 트랜잭션의 트래픽만 확인한 유휴 UDP 흐름에 대한 제한 기간(초)입니다. 최솟값: 30초. 최댓값: 60초. 기본값: 30초.
      + **UDP 스트림 제한 시간** - 둘 이상의 요청-응답 트랜잭션을 확인한 스트림으로 분류된 유휴 UDP 흐름에 대한 제한 기간(초)입니다. 최솟값: 60초. 최댓값: 180초(3분) 기본값: 180초

1. **보안 그룹(Security groups)**에서 하나 이상의 보안 그룹을 선택합니다.

1. **네트워크 인터페이스 생성**을 선택합니다.

------
#### [ AWS CLI ]

**EFA를 생성하려면**  
[create-network-interface](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-interface.html) 명령을 사용합니다. `--interface-type`에는 EFA 네트워크 인터페이스의 경우 `efa`, EFA 전용 네트워크 인터페이스의 경우 `efa-only`를 지정합니다.

```
aws ec2 create-network-interface \
    --subnet-id subnet-0abcdef1234567890 \
    --interface-type efa \
    --description "my efa"
```

------
#### [ PowerShell ]

**EFA를 생성하려면**  
[New-EC2NetworkInterface](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2NetworkInterface.html) cmdlet을 사용합니다. `-InterfaceType`에는 EFA 네트워크 인터페이스의 경우 `efa`, EFA 전용 네트워크 인터페이스의 경우 `efa-only`를 지정합니다.

```
New-EC2NetworkInterface `
    -SubnetId subnet-0abcdef1234567890 `
    -InterfaceType efa `
    -Description "my efa"
```

------

## 중지된 인스턴스에 EFA 연결
<a name="efa-attach"></a>

`stopped` 상태에 있는 지원되는 모든 인스턴스에 EFA를 연결할 수 있습니다. `running` 상태인 인스턴스에는 EFA를 연결할 수 없습니다. 지원되는 인스턴스 유형에 대한 자세한 내용은 [지원되는 인스턴스 유형](efa.md#efa-instance-types) 섹션을 참조하세요.

네트워크 인터페이스를 인스턴스에 연결하는 방법을 사용해 EFA를 연결할 수 있습니다. 자세한 내용은 [네트워크 인터페이스 연결](network-interface-attachments.md#attach_eni) 섹션을 참조하세요.

## 인스턴스를 시작할 때 EFA 연결
<a name="efa-launch"></a>

------
#### [ AWS CLI ]

**인스턴스를 시작할 때 기존 EFA를 연결하려면**  
[run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 명령을 `--network-interfaces` 옵션과 함께 사용합니다. 기본 네트워크 인터페이스에 대해 EFA 네트워크 인터페이스와 `NetworkCardIndex=0`, `DeviceIndex=0`을 지정합니다. 여러 EFA 네트워크 인터페이스를 연결하려면 [네트워크 대역폭 극대화](efa-acc-inst-types.md) 섹션을 참조하세요.

```
--network-interfaces "NetworkCardIndex=0, \
    DeviceIndex=0, \
    NetworkInterfaceId=eni-1234567890abcdef0, \
    Groups=sg-1234567890abcdef0, \
    SubnetId=subnet-0abcdef1234567890"
```

**인스턴스를 시작할 때 새 EFA를 연결하려면**  
[run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 명령을 `--network-interfaces` 옵션과 함께 사용합니다. 기본 네트워크 인터페이스의 경우 `NetworkCardIndex=0`, `DeviceIndex=0`, `InterfaceType=efa`을 사용합니다. 여러 EFA 네트워크 인터페이스를 연결하는 경우 [네트워크 대역폭 극대화](efa-acc-inst-types.md) 섹션을 참조하세요.

```
--network-interfaces "NetworkCardIndex=0, \
    DeviceIndex=0, \
    InterfaceType=efa, \
    Groups=sg-1234567890abcdef0, \
    SubnetId=subnet-0abcdef1234567890"
```

------
#### [ PowerShell ]

**인스턴스를 시작할 때 기존 EFA를 연결하려면**  
`-NetworkInterfaces` 파라미터와 함께 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet을 사용합니다.

```
-NetworkInterface $networkInterface
```

다음과 같이 네트워크 인터페이스를 정의합니다.

```
$networkInterface = New-Object Amazon.EC2.Model.InstanceNetworkInterfaceSpecification
$networkInterface.DeviceIndex = 0
$networkInterface.NetworkInterfaceId = "eni-1234567890abcdef0"
$networkInterface.Groups = @("sg-1234567890abcdef0")
$networkInterface.SubnetId = "subnet-0abcdef1234567890"
```

**인스턴스를 시작할 때 새 EFA를 연결하려면**  
`-NetworkInterfaces` 파라미터와 함께 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet을 사용합니다.

```
-NetworkInterface $networkInterface
```

다음과 같이 네트워크 인터페이스를 정의합니다.

```
$networkInterface = New-Object Amazon.EC2.Model.InstanceNetworkInterfaceSpecification
$networkInterface.DeviceIndex = 0
$networkInterface.InterfaceType = "efa"
$networkInterface.Groups = @("sg-1234567890abcdef0")
$networkInterface.SubnetId = "subnet-0abcdef1234567890"
```

------

## 시작 템플릿에 EFA 추가
<a name="efa-launch-template"></a>

EFA 지원 인스턴스 시작에 필요한 구성 정보가 포함된 시작 템플릿을 생성할 수 있습니다. 시작 템플릿에서 EFA 및 EFA 전용 네트워크 인터페이스를 모두 지정할 수 있습니다. EFA 지원 시작 템플릿을 생성하려면 새 시작 템플릿을 생성하고 지원되는 인스턴스 유형과 EFA 지원 AMI, EFA 지원 보안 그룹을 지정합니다. `NetworkInterfaces`에는 연결할 EFA 네트워크 인터페이스를 지정합니다. 기본 네트워크 인터페이스의 경우 `NetworkCardIndex=0`, `DeviceIndex=0`, `InterfaceType=efa`을 사용합니다. 여러 EFA 네트워크 인터페이스를 연결하는 경우 [여러 네트워크 카드를 사용하여 Amazon EC2 인스턴스의 네트워크 대역폭 극대화](efa-acc-inst-types.md)를 참조하세요.

시작 템플릿을 활용하여 다른 AWS 서비스(예: [AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/what-is-batch.html) 또는 [AWS ParallelCluster](https://docs.aws.amazon.com/parallelcluster/latest/ug/what-is-aws-parallelcluster.html))와 함께 EFA 사용 인스턴스를 시작할 수 있습니다.

시작 템플릿 생성에 대한 자세한 내용은 [Amazon EC2 시작 템플릿 생성](create-launch-template.md) 섹션을 참조하세요.

# Amazon EC2 인스턴스에서 EFA 분리 및 삭제
<a name="detach-efa"></a>

Amazon EC2의 다른 탄력적 네트워크 인터페이스와 동일한 방식으로 Amazon EC2 인스턴스에서 EFA를 분리하고 삭제할 수 있습니다.

## EFA 분리
<a name="efa-detach"></a>

인스턴스에서 EFA을 분리하려면 먼저 인스턴스를 정지해야 합니다. 실행 중인 인스턴스에서 EFA의 연결을 중단시킬 수 없습니다.

탄력적 네트워크 인터페이스를 인스턴스에서 연결 중단하는 방법을 사용해 EFA를 연결 중단할 있습니다. 자세한 내용은 [네트워크 인터페이스 분리](network-interface-attachments.md#detach_eni) 섹션을 참조하세요.

## EFA 삭제
<a name="efa-delete"></a>

EFA을 제거하려면 먼저 인스턴스에서 분리하여야 합니다. 인스턴스에 연결된 상태에서 EFA를 제거할 수 없습니다.

탄력적 네트워크 인터페이스 제거와 동일한 방법으로 EFAs를 제거합니다. 자세한 내용은 [네트워크 인터페이스 삭제](delete_eni.md) 섹션을 참조하세요.

# Amazon EC2에서 Elastic Fabric Adapter 모니터링
<a name="efa-working-monitor"></a>

다음 기능을 사용해 Elastic Fabric Adapter(EFA)의 성능을 모니터링할 수 있습니다.

**Topics**
+ [Amazon EC2 인스턴스의 EFA 드라이버 메트릭](#efa-driver-metrics)
+ [Amazon VPC 흐름 로그](#efa-flowlog)
+ [Amazon CloudWatch](#efa-cloudwatch)

## Amazon EC2 인스턴스의 EFA 드라이버 메트릭
<a name="efa-driver-metrics"></a>

Elastic Fabric Adapter(EFA) 드라이버는 EFA 인터페이스가 연결된 인스턴스의 여러 지표를 실시간으로 게시합니다. 이러한 메트릭을 사용하여 애플리케이션 성능 및 네트워킹 문제를 해결하고, 워크로드에 적합한 클러스터 크기를 선택하며, 크기 조정을 사전에 계획하고, 애플리케이션 벤치마킹을 통해 인스턴스에서 제공되는 EFA 성능을 최대한 활용하는지 판단할 수 있습니다.

**Topics**
+ [사용 가능한 EFA 드라이버 메트릭](#available-efa-metrics)
+ [인스턴스의 EFA 드라이버 메트릭을 검색합니다.](#view-efa-driver-metrics)

### 사용 가능한 EFA 드라이버 메트릭
<a name="available-efa-metrics"></a>

EFA 드라이버는 인스턴스에 다음과 같은 지표를 실시간으로 게시합니다. 해당 EFA 디바이스는 인스턴스 시작 시점 또는 마지막 드라이버 재설정 이후 누적된 오류 수, 연결 이벤트 수, 그리고 전송/수신/재전송/손실된 패킷 또는 바이트 수를 제공합니다.


| 지표 | 설명 | 지원되는 인스턴스 유형 | 
| --- | --- | --- | 
| tx\$1bytes |  전송된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| rx\$1bytes |  수신한 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| tx\$1pkts |  전송된 패킷 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rx\$1pkts |  수신된 패킷 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rx\$1drops |  수신 후 삭제된 패킷 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| send\$1bytes |  전송 작업을 사용하여 전송된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| recv\$1bytes |  전송 작업을 사용하여 수신된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| send\$1wrs |  전송 작업을 사용하여 전송된 패킷 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| recv\$1wrs |  전송 작업을 사용하여 수신된 패킷 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1write\$1wrs |  완료된 rdma 쓰기 작업 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1read\$1wrs |  완료된 rdma 읽기 작업 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1write\$1bytes |  rdma 쓰기 작업 수를 사용하여 다른 인스턴스에 의해 기록된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1read\$1bytes |  rdma 읽기 작업 수를 사용하여 수신된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1write\$1wr\$1err |  로컬 또는 원격 오류가 발생한 rdma 쓰기 작업 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1read\$1wr\$1err |  로컬 또는 원격 오류가 발생한 rdma 읽기 작업 수입니다. 단위: 수  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1read\$1resp\$1bytes |  rdma 읽기 작업 수에 대한 응답으로 전송된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| rdma\$1write\$1recv\$1bytes |  rdma 쓰기 작업을 사용하여 수신된 바이트 수입니다. 단위: 바이트  | EFA를 지원하는 모든 인스턴스 유형 | 
| retrans\$1bytes |  재전송된 EFA SRD 바이트 수입니다. 단위: 수  | EFA를 지원하는 Nitro v4 이상 인스턴스 유형 | 
| retrans\$1pkts |  재전송된 EFA SRD 패킷 수입니다. 단위: 바이트  | EFA를 지원하는 Nitro v4 이상 인스턴스 유형 | 
| retrans\$1timeout\$1events |  EFA SRD 트래픽이 시간 초과되어 네트워크 경로가 변경된 횟수입니다. 단위: 수  | EFA를 지원하는 Nitro v4 이상 인스턴스 유형 | 
| impaired\$1remote\$1conn\$1events |  EFA SRD 연결이 손상된 상태로 전환되어 처리량 속도 제한이 감소한 횟수입니다. 단위: 수  | EFA를 지원하는 Nitro v4 이상 인스턴스 유형 | 
| unresponsive\$1remote\$1events |  EFA SRD 원격 연결이 응답하지 않은 횟수입니다. 단위: 수  | EFA를 지원하는 Nitro v4 이상 인스턴스 유형 | 

EFA를 지원하는 인스턴스 유형에 대한 자세한 내용은 [지원되는 인스턴스 유형](efa.md#efa-instance-types) 섹션을 참조하세요.

### 인스턴스의 EFA 드라이버 메트릭을 검색합니다.
<a name="view-efa-driver-metrics"></a>

[rdma-tool](https://man7.org/linux/man-pages/man8/rdma.8.html) 명령줄 도구를 사용하여 다음과 같이 인스턴스에 연결된 모든 EFA 인터페이스의 메트릭을 검색할 수 있습니다.

```
$ rdma -p statistic show
link rdmap0s31/1 
    tx_bytes 0 
    tx_pkts 0 
    rx_bytes 0 
    rx_pkts 0 
    rx_drops 0 
    send_bytes 0 
    send_wrs 0 
    recv_bytes 0 
    recv_wrs 0 
    rdma_read_wrs 0 
    rdma_read_bytes 0 
    rdma_read_wr_err 0 
    rdma_read_resp_bytes 0 
    rdma_write_wrs 0 
    rdma_write_bytes 0 
    rdma_write_wr_err 0
    retrans_bytes 0
    retrans_pkts 0
    retrans_timeout_events 0
    unresponsive_remote_events 0
    impaired_remote_conn_events 0
```

또는 다음 명령을 사용하여 sys 파일에서 인스턴스에 연결된 각 EFA 인터페이스의 메트릭을 검색할 수 있습니다.

```
$ more /sys/class/infiniband/device_number/ports/port_number/hw_counters/* | cat
```

예제

```
$ more /sys/class/infiniband/rdmap0s31/ports/1/hw_counters/* | cat
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/lifespan
::::::::::::::
12
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_resp_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_wr_err
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_read_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_recv_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_wr_err
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rdma_write_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/recv_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/recv_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_drops
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/rx_pkts
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/send_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/send_wrs
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/tx_bytes
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/tx_pkts
::::::::::::::
0
::::::::::::::
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_bytes
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_pkts
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/retrans_timeout_events
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/unresponsive_remote_events
::::::::::::::
0
/sys/class/infiniband/rdmap0s31/ports/1/hw_counters/impaired_remote_conn_events
::::::::::::::
0
```

## Amazon VPC 흐름 로그
<a name="efa-flowlog"></a>

Amazon VPC 플로우 로그를 생성하여 EFA로 들어오고 나가는 트래픽에 대한 세부 정보를 캡처할 수 있습니다. 플로우 로그 데이터를 Amazon CloudWatch Logs 및 Amazon S3로 게시할 수 있습니다. 플로우 로그를 생성한 다음 선택된 대상의 데이터를 가져와 확인할 수 있습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC 흐름 로그](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)를 참조하세요.

탄력적 네트워크 인터페이스에 플로우 로그를 생성한 것과 동일한 방법으로 EFA에 플로우 로그를 생성할 수 있습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [플로우 로그 생성](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-flow-logs.html#create-flow-log)을 참조하세요.

다음 예제에서와 같이 플로우 로그 항목에서 EFA 트래픽은 MAC 주소 유형인 `srcAddress`와 `destAddress`으로 식별됩니다.

```
version accountId  eniId        srcAddress        destAddress       sourcePort destPort protocol packets bytes start      end        action log-status
2       3794735123 eni-10000001 01:23:45:67:89:ab 05:23:45:67:89:ab -          -        -        9       5689  1521232534 1524512343 ACCEPT OK
```

## Amazon CloudWatch
<a name="efa-cloudwatch"></a>

Amazon EKS 클러스터에서 EFA를 사용하는 경우 CloudWatch 컨테이너 인사이트를 사용하여 EFA를 모니터링할 수 있습니다. Amazon CloudWatch Container Insights는 `retrans_bytes`, `retrans_pkts`, `retrans_timeout_events`, `unresponsive_remote_events` 및 `impaired_remote_conn_events`를 제외한 모든 [EFA 드라이버 지표](#efa-driver-metrics)를 지원합니다.

자세한 정보는 *Amazon CloudWatch 사용 설명서*의 [Amazon EKS 및 Kubernetes Container Insights 지표](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-enhanced-EKS.html#Container-Insights-metrics-EFA)를 참조하세요.

# 체크섬을 사용하여 EFA 설치 프로그램 확인
<a name="efa-verify"></a>

선택적으로 MD5 또는 SHA256 체크섬을 사용하여 EFA tarball(`.tar.gz` 파일)을 확인할 수 있습니다. 이 작업을 수행하여 소프트웨어 게시자의 자격 증명을 확인하고 애플리케이션이 게시된 이후 변경되거나 손상되지 않았는지 확인하는 것이 좋습니다.

**tarball을 확인하려면**  
MD5 체크섬에 **md5sum** 유틸리티를 사용하거나 SHA256 체크섬에 **sha256sum** 유틸리티를 사용하고 tarball 파일 이름을 지정합니다. tarball 파일을 저장한 디렉터리에서 명령을 실행해야 합니다.
+ MD5

  ```
  $  md5sum tarball_filename.tar.gz
  ```
+ SHA256

  ```
  $  sha256sum tarball_filename.tar.gz
  ```

명령은 다음 형식으로 체크섬 값을 반환해야 합니다.

```
checksum_value tarball_filename.tar.gz
```

명령에서 반환한 체크섬 값을 아래 표에 제공된 체크섬 값과 비교합니다. 체크섬이 일치하면 설치 스크립트를 실행하는 것이 안전합니다. 체크섬이 일치하지 않으면 설치 스크립트를 실행하지 말고 지원에 문의하세요.

예를 들어, 다음 명령은 SHA256 체크섬을 사용하여 EFA 1.9.4 tarball을 확인합니다.

```
$  sha256sum aws-efa-installer-1.9.4.tar.gz
```

출력 예시:

```
1009b5182693490d908ef0ed2c1dd4f813cc310a5d2062ce9619c4c12b5a7f14 aws-efa-installer-1.9.4.tar.gz
```

다음 표에는 최신 버전의 EFA에 대한 체크섬이 나열되어 있습니다.


| 버전 | 체크섬 | 
| --- | --- | 
| EFA 1.47.0 |  **MD5: **`c81d4caf24dabc04a6e4818590620f5f` **SHA256: **`2df4201e046833c7dc8160907bee7f52b76ff80ed147376a2d0ed8a0dd66b2db`  | 
| EFA 1.46.0 |  **MD5: **a88bbd9b71624d7ca401b54bc2fc0c19`` **SHA256: **`8302bd7849afb95c903a875d7dcb6f85b3d7629e9a8b67d020031cfc6f4d0ee1`  | 
| EFA 1.45.1 |  **MD5: **91c3c87e16bbcaca1513252c38b771bb`` **SHA256: **`9aeb20c645135b6039cc08986d8f14e63280f7839e882a74df5e83627ffeaa17`  | 
| EFA 1.45.0 |  **MD5: **800aeddfa9d9c5f139a7b8f7c4fec627`` **SHA256: **`25ba26a0877fe3317390dc126aad2f23e27fc461cf0b940004f032cb342fa539`  | 
| EFA 1.44.0 |  **MD5: **d024f6bebe080db42745103b84ca7c43`` **SHA256: **`f129a5b44a49d593d247e55a59eb9bcb57121566e1c2e42b832a4e794fa83d8a`  | 
| EFA 1.43.3 |  **MD5: **`4dbc6eeecc516760253c10cbedb6319d` **SHA256: **`6c470ebce254c7165347b5048895ac2996c88567271642297f4c597738300652`  | 
| EFA 1.43.2 |  **MD5: **`7287b25a07c9747c0d4001e8fc5f59b2` **SHA256: **`de15c5bdbc83b952afbde876110830c604ad0796680e5157c05f7c1979a41069`  | 
| EFA 1.43.1 |  **MD5: **`7cfafc8debaea51dd4966fa0b2bba673` **SHA256: **54211eda0c193138ee8ed09b5fb41c41fc76fe0a77935fa4ec8d989466342740``  | 
| EFA 1.43.0 |  **MD5: **`f2b3dd7dc8670b541f7c23fd58e5e503` **SHA256: **`786df3458c499237be33bb8e50ffd4da7c18c20e254380ffc80fb90833d8cc73`  | 
| EFA 1.42.0 |  **MD5: **`94b2b1db09da1dde08ec049db1f24370` **SHA256: **`4114fe612905ee05083ae5cb391a00a012510f3abfecc642d86c9a5ae4be9008`  | 
| EFA 1.41.0 |  **MD5: **`086181c3ee3f8da512fc6e1c795e8936` **SHA256: **`3506354cdfbe31ff552fe75f5d0d9bb7efd29cf79bd99457347d29c751c38f9f`  | 
| EFA 1.40.0 |  **MD5: **`f3ec6f73fbeaccba082327507581157c` **SHA256: **`30491b0fe7c3470d4439594538855c981b05fa69862d74f8c05eb9b97912368a`  | 
| EFA 1.39.0 |  **MD5: **`c223d5954a85a7fbcd248c942b866e43` **SHA256: **`2cbc028c03064633bb990782b47c36156637769e2f48704417a9c700a7a32101`  | 
| EFA 1.38.1 |  **MD5: **`f112569e828ab65187777f794bab542c` **SHA256: **`83923374afd388b1cfcf4b3a21a2b1ba7cf46a01a587f7b519b8386cb95e4f81`  | 
| EFA 1.38.0 |  **MD5: **`43a2a446b33a2506f40853d55059f1ea` **SHA256: **`4f436954f35ad53754b4d005fd8d0be63de3b4184de41a695b504bdce0fecb22`  | 
| EFA 1.37.0 |  **MD5: **`6328070192bae920eca45797ad4c1db1` **SHA256: **`2584fc3c8bb99f29b3285e275747ff09d67c18e162c2a652e36c976b72154bfb`  | 
| EFA 1.36.0 |  **MD5: **`1bec83180fbffb23452ab6469ca21dfa` **SHA256: **`de183f333cfb58aeb7908a67bf9106985ba3ccb7f8638b851d2a0d8dbfacaec4`  | 
| EFA 1.35.0 |  **MD5: **`252f03c978dca5f8e8d9f34e488b256e` **SHA256: **`432b6ad4368ba0cd8b902729d14a908a97be7a3dcc5239422ea994a47f35a5e1`  | 
| EFA 1.34.0 |  **MD5: **`5cd4b28d27a31677c16139b54c9acb45` **SHA256: **`bd68839e741b0afd3ec2e37d50603803cfa7a279c120f0a736cc57c2ff2d7fdc`  | 
| EFA 1.33.0 |  **MD5: **`e2f61fccbcaa11e2ccfddd3660522276` **SHA256: **`0372877b87c6a7337bb7791d255e1053b907d030489fb2c3732ba70069185fce`  | 
| EFA 1.32.0 |  **MD5: **`db8d65cc028d8d08b5a9f2d88881c1b1` **SHA256: **`5f7233760be57f6fee6de8c09acbfbf59238de848e06048dc54d156ef578fc66`  | 
| EFA 1.31.0 |  **MD5: **`856352f12bef2ccbadcd75e35aa52aaf` **SHA256: **`943325bd37902a4300ac9e5715163537d56ecb4e7b87b37827c3e547aa1897bf`  | 
| EFA 1.30.0 |  **MD5: **`31f48e1a47fe93ede8ebd273fb747358` **SHA256: **`876ab9403e07a0c3c91a1a34685a52eced890ae052df94857f6081c5f6c78a0a`  | 
| EFA 1.29.1 |  **MD5: **`e1872ca815d752c1d7c2b5c175e52a16` **SHA256: **`178b263b8c25845b63dc93b25bcdff5870df5204ec509af26f43e8d283488744`  | 
| EFA 1.29.0 |  **MD5: **`39d06a002154d94cd982ed348133f385` **SHA256: **`836655f87015547e733e7d9f7c760e4e24697f8bbc261bb5f3560abd4206bc36`  | 
| EFA 1.28.0 |  **MD5: **`9dc13b7446665822605e66febe074035` **SHA256: **`2e625d2d6d3e073b5178e8e861891273d896b66d03cb1a32244fd56789f1c435`  | 
| EFA 1.27.0 |  **MD5: **`98bfb515ea3e8d93f554020f3837fa15` **SHA256: **`1d49a97b0bf8d964d91652a79ac851f2550e33a5bf9d0cf86ec9357ff6579aa3`  | 
| EFA 1.26.1 |  **MD5: **`884e74671fdef4725501f7cd2d451d0c` **SHA256: **`c616994c924f54ebfabfab32b7fe8ac56947fae00a0ff453d975e298d174fc96`  | 
| EFA 1.26.0 |  **MD5: **`f8839f12ff2e3b9ba09ae8a82b30e663` **SHA256: **`bc1abc1f76e97d204d3755d2a9ca307fc423e51c63141f798c2f15be3715aa11`  | 
| EFA 1.25.1 |  **MD5: **`6d876b894547847a45bb8854d4431f18` **SHA256: **`d2abc553d22b89a4ce92882052c1fa6de450d3a801fe005da718b7d4b9602b06`  | 
| EFA 1.25.0 |  **MD5: **`1993836ca749596051da04694ea0d00c` **SHA256: **`98b7b26ce031a2d6a93de2297cc71b03af647194866369ca53b60d82d45ad342`  | 
| EFA 1.24.1 |  **MD5: **`211b249f39d53086f3cb0c07665f4e6f` **SHA256: **`120cfeec233af0955623ac7133b674143329f9561a9a8193e473060f596aec62`  | 
| EFA 1.24.0 |  **MD5: **`7afe0187951e2dd2c9cc4b572e62f924` **SHA256: **`878623f819a0d9099d76ecd41cf4f569d4c3aac0c9bb7ba9536347c50b6bf88e`  | 
| EFA 1.23.1 |  **MD5: **`22491e114b6ee7160a8290145dca0c28` **SHA256: **`5ca848d8e0ff4d1571cd443c36f8d27c8cdf2a0c97e9068ebf000c303fc40797`  | 
| EFA 1.23.0 |  **MD5: **`38a6d7c1861f5038dba4e441ca7683ca` **SHA256: **`555d497a60f22e3857fdeb3dfc53aa86d05926023c68c916d15d2dc3df6525bd`  | 
| EFA 1.22.1 |  **MD5: **`600c0ad7cdbc06e8e846cb763f92901b` **SHA256: **`f90f3d5f59c031b9a964466b5401e86fd0429272408f6c207c3f9048254e9665`  | 
| EFA 1.22.0 |  **MD5: **`8f100c93dc8ab519c2aeb5dab89e98f8` **SHA256: **`f329e7d54a86a03ea51da6ea9a5b68fb354fbae4a57a02f9592e21fce431dc3a`  | 
| EFA 1.21.0 |  **MD5: **`959ccc3a4347461909ec02ed3ba7c372` **SHA256: **`c64e6ca34ccfc3ebe8e82d08899ae8442b3ef552541cf5429c43d11a04333050`  | 
| EFA 1.20.0 |  **MD5: **`7ebfbb8e85f1b94709df4ab3db47913b` **SHA256: **`aeefd2681ffd5c4c631d1502867db5b831621d6eb85b61fe3ec80df983d1dcf0`  | 
| EFA 1.19.0 |  **MD5: **`2fd45324953347ec5518da7e3fefa0ec` **SHA256: **`99b77821b9e72c8dea015cc92c96193e8db307deee05b91a58094cc331f16709`  | 
| EFA 1.18.0 |  **MD5: **`fc2571a72f5d3c7b7b576ce2de38d91e` **SHA256: **`acb18a0808aedb9a5e485f1469225b9ac97f21db9af78e4cd6939700debe1cb6`  | 
| EFA 1.17.3 |  **MD5: **`0517df4a190356ab559235147174cafd` **SHA256: **`5130998b0d2883bbae189b21ab215ecbc1b01ae0231659a9b4a17b0a33ebc6ca`  | 
| EFA 1.17.2 |  **MD5: **`a329dedab53c4832df218a24449f4c9a` **SHA256: **`bca1fdde8b32b00346e175e597ffab32a09a08ee9ab136875fb38283cc4cd099`  | 
| EFA 1.17.1 |  **MD5: **`733ae2cfc9d14b52017eaf0a2ab6b0ff` **SHA256: **`f29322640a88ae9279805993cb836276ea240623820848463ca686c8ce02136f`  | 
| EFA 1.17.0 |  **MD5: **`d430fc841563c11c3805c5f82a4746b1` **SHA256: **`75ab0cee4fb6bd38889dce313183f5d3a83bd233e0a6ef6205d8352821ea901d`  | 
| EFA 1.16.0 |  **MD5: **`399548d3b0d2e812d74dd67937b696b4` **SHA256: **`cecec36495a1bc6fdc82f97761a541e4fb6c9a3cbf3cfcb145acf25ea5dbd45b`  | 
| EFA 1.15.2 |  **MD5: **`955fea580d5170b05823d51acde7ca21` **SHA256: **`84df4fbc1b3741b6c073176287789a601a589313accc8e6653434e8d4c20bd49`  | 
| EFA 1.15.1 |  **MD5: **`c4610267039f72bbe4e35d7bf53519bc` **SHA256: **`be871781a1b9a15fca342a9d169219260069942a8bda7a8ad06d4baeb5e2efd7`  | 
| EFA 1.15.0 |  **MD5: **`9861694e1cc00d884fadac07d22898be` **SHA256: **`b329862dd5729d2d098d0507fb486bf859d7c70ce18b61c302982234a3a5c88f`  | 
| EFA 1.14.1 |  **MD5: **`50ba56397d359e57872fde1f74d4168a` **SHA256: **`c7b1b48e86fe4b3eaa4299d3600930919c4fe6d88cc6e2c7e4a408a3f16452c7`  | 
| EFA 1.14.0 |  **MD5: **`40805e7fd842c36ececb9fd7f921b1ae` **SHA256: **`662d62c12de85116df33780d40e0533ef7dad92709f4f613907475a7a1b60a97`  | 
| EFA 1.13.0 |  **MD5: **`c91d16556f4fd53becadbb345828221e` **SHA256: **`ad6705eb23a3fce44af3afc0f7643091595653a723ad0374084f4f2b715192e1`  | 
| EFA 1.12.3 |  **MD5: **`818aee81f097918cfaebd724eddea678` **SHA256: **`2c225321824788b8ca3fbc118207b944cdb096b847e1e0d1d853ef2f0d727172`  | 
| EFA 1.12.2 |  **MD5: **`956bb1fc5ae0d6f0f87d2e481d49fccf` **SHA256: **`083a868a2c212a5a4fcf3e4d732b685ce39cceb3ca7e5d50d0b74e7788d06259`  | 
| EFA 1.12.1 |  **MD5: **`f5bfe52779df435188b0a2874d0633ea` **SHA256: **`5665795c2b4f09d5f3f767506d4d4c429695b36d4a17e5758b27f033aee58900`  | 
| EFA 1.12.0 |  **MD5: **`d6c6b49fafb39b770297e1cc44fe68a6` **SHA256: **`28256c57e9ecc0b0778b41c1f777a9982b4e8eae782343dfe1246079933dca59`  | 
| EFA 1.11.2 |  **MD5: **`2376cf18d1353a4551e35c33d269c404` **SHA256: **`a25786f98a3628f7f54f7f74ee2b39bc6734ea9374720507d37d3e8bf8ee1371`  | 
| EFA 1.11.1 |  **MD5: **`026b0d9a0a48780cc7406bd51997b1c0` **SHA256: **`6cb04baf5ffc58ddf319e956b5461289199c8dd805fe216f8f9ab8d102f6d02a`  | 
| EFA 1.11.0 |  **MD5: **`7d9058e010ad65bf2e14259214a36949` **SHA256: **`7891f6d45ae33e822189511c4ea1d14c9d54d000f6696f97be54e915ce2c9dfa`  | 
| EFA 1.10.1 |  **MD5: **`78521d3d668be22976f46c6fecc7b730` **SHA256: **`61564582de7320b21de319f532c3a677d26cc46785378eb3b95c636506b9bcb4`  | 
| EFA 1.10.0 |  **MD5: **`46f73f5a7afe41b4bb918c81888fefa9` **SHA256: **`136612f96f2a085a7d98296da0afb6fa807b38142e2fc0c548fa986c41186282`  | 
| EFA 1.9.5 |  **MD5: **`95edb8a209c18ba8d250409846eb6ef4` **SHA256: **`a4343308d7ea4dc943ccc21bcebed913e8868e59bfb2ac93599c61a7c87d7d25`  | 
| EFA 1.9.4 |  **MD5: **`f26dd5c350422c1a985e35947fa5aa28` **SHA256: **`1009b5182693490d908ef0ed2c1dd4f813cc310a5d2062ce9619c4c12b5a7f14`  | 
| EFA 1.9.3 |  **MD5: **`95755765a097802d3e6d5018d1a5d3d6` **SHA256: **`46ce732d6f3fcc9edf6a6e9f9df0ad136054328e24675567f7029edab90c68f1`  | 
| EFA 1.8.4 |  **MD5: **`85d594c41e831afc6c9305263140457e` **SHA256: **`0d974655a09b213d7859e658965e56dc4f23a0eee2dc44bb41b6d039cc5bab45`  | 

# Elastic Fabric Adapter 릴리스 정보
<a name="efa-changelog"></a>

다음 표에서는 Elastic Fabric Adapter 소프트웨어의 버전 기록과 변경 로그를 설명합니다.


| 버전 | 변경 사항 | 릴리스 날짜 | 
| --- | --- | --- | 
| 1.47.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2026년 1월 29일 | 
| 1.46.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 12월 12일 | 
| 1.45.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 11월 26일 | 
| 1.45.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 11월 17일 | 
| 1.44.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 10월 29일 | 
| 1.43.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 10월 1일 | 
| 1.43.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 8월 15일 | 
| 1.43.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 7월 31일 | 
| 1.43.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 7월 25일 | 
| 1.42.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 6월 6일 | 
| 1.41.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 5월 16일 | 
| 1.40.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 5월 2일 | 
| 1.39.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 4월 16일 | 
| 1.38.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 3월 3일 | 
| 1.38.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2025년 1월 8일 | 
| 1.37.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 11월 18일 | 
| 1.36.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 11월 7일 | 
| 1.35.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 10월 14일 | 
| 1.34.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 8월 6일 | 
| 1.33.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 6월 20일 | 
| 1.32.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 4월 18일 | 
| 1.31.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2024년 3월 7일 | 
| 1.30.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 12월 | 
| 1.29.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 12월 | 
| 1.29.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 11월 | 
| 1.28.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 10월 | 
| 1.27.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 9월 | 
| 1.26.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 9월 | 
| 1.26.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 9월 | 
| 1.25.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 9월 | 
| 1.25.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 7월 | 
| 1.24.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 7월 | 
| 1.24.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 6월 | 
| 1.23.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 6월 | 
| 1.23.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 5월 | 
| 1.22.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 3월 | 
| 1.22.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2023년 2월 | 
| 1.21.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 12월 | 
| 1.20.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 11월 | 
| 1.19.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 10월 | 
| 1.18.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 8월 | 
| 1.17.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 8월 | 
| 1.17.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 7월 | 
| 1.17.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 7월 | 
| 1.17.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 7월 | 
| 1.16.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 6월 | 
| 1.15.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 5월 | 
| 1.15.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 3월 | 
| 1.15.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2022년 2월 | 
| 1.14.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 10월 | 
| 1.14.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 10월 | 
| 1.13.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 8월 | 
| 1.12.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 7월 | 
| 1.12.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 6월 | 
| 1.12.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 5월 | 
| 1.12.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 5월 | 
| 1.11.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2021년 2월 | 
| 1.11.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 12월 | 
| 1.11.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 12월 | 
| 1.10.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 11월 | 
| 1.10.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 10월 | 
| 1.9.5 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 9월 | 
| 1.9.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 7월 | 
| 1.9.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 6월 | 
| 1.8.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 4월 | 
| 1.8.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 2월 | 
| 1.8.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 1월 | 
| 1.8.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2020년 1월 | 
| 1.8.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 12월 | 
| 1.7.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 12월 | 
| 1.7.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 11월 | 
| 1.6.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 10월 | 
| 1.6.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 10월 | 
| 1.5.4 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 9월 | 
| 1.5.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 9월 | 
| 1.5.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 8월 | 
| 1.5.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 8월 | 
| 1.4.1 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 7월 | 
| 1.4.0 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/efa-changelog.html)  | 2019년 7월 | 