ILGPU 설치와 환경 설정

ILGPU를 활용해 GPU 병렬 연산을 시작하려면 올바른 환경 설정이 필수입니다. 이 섹션에서는 리눅스(Ubuntu 22.04)를 중심으로 NVIDIA H100 GPU에서 ILGPU를 설치하고 설정하는 방법을 단계별로 설명합니다. H100은 데이터센터급 GPU로, ILGPU의 CUDA 백엔드를 통해 Tensor 코어와 80GB HBM3 메모리의 강력한 성능을 활용할 수 있습니다. 또한, 윈도우와 macOS에서의 간략한 설정 가이드와 벡터 내적(dot product)을 계산하는 예제를 제공하여 설정을 확인합니다. 초보자는 따라 하기 쉬운 지침을, 숙련자는 H100 최적화와 문제 해결 팁을 얻을 수 있습니다.

환경 설정 요구사항

ILGPU는 크로스 플랫폼 라이브러리로 다양한 운영 체제와 하드웨어를 지원합니다. 리눅스에서 H100을 사용하기 위한 요구사항은 다음과 같습니다:

  • 운영 체제: Ubuntu 22.04 LTS (H100 드라이버와 CUDA 호환성 우수).
  • GPU: NVIDIA H100 (PCIe/SXM, 80GB HBM3).
  • 드라이버: NVIDIA 데이터센터 드라이버 535.104.05 이상.
  • CUDA Toolkit: CUDA 12.2 이상 (Hopper 아키텍처 지원).
  • .NET: .NET 8.0 또는 9.0 SDK.
  • 의존성: ILGPU NuGet 패키지, 선택적으로 SDL2 (디버깅용 창/입력 처리).
  • 개발 환경: Visual Studio Code, JetBrains Rider, 또는 CLI.

리눅스(Ubuntu 22.04)에서 ILGPU 설치

리눅스에서 H100을 활용한 ILGPU 환경 설정 과정을 단계별로 설명합니다.

1. NVIDIA 드라이버 설치

H100 GPU를 사용하려면 최신 NVIDIA 데이터센터 드라이버가 필요합니다.

sudo apt-get update
sudo apt-get install -y nvidia-driver-535 nvidia-utils-535

확인:

nvidia-smi

출력: H100 정보 (예: GPU 이름, 메모리, 드라이버 버전).
H100이 표시되지 않으면 드라이버 재설치 또는 GPU 연결 확인.

2. CUDA Toolkit 설치

ILGPU의 CUDA 백엔드는 H100의 고성능 연산을 위해 CUDA 런타임이 필요합니다.

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get install -y cuda

확인:

nvcc --version

출력: CUDA 12.2 이상.

환경 변수 (필요 시):

echo 'export PATH=$PATH:/usr/local/cuda/bin' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc
source ~/.bashrc

3. .NET 8.0 설치

ILGPU는 .NET 8.0/9.0과 호환되며, .NET 8.0은 안정성과 H100 환경에서의 테스트가 잘 되어 있습니다.

sudo apt-get update
sudo apt-get install -y dotnet-sdk-8.0

확인:

dotnet --version

출력: 8.0.100 이상.

.NET 9.0 설치 (선택):

sudo apt-get install -y dotnet-sdk-9.0

4. ILGPU NuGet 패키지 설치

ILGPU는 NuGet 패키지로 제공됩니다.

새 프로젝트 생성:

dotnet new console -n ILGPUDotProduct
cd ILGPUDotProduct

ILGPU 패키지 추가:

dotnet add package ILGPU
dotnet add package ILGPU.Algorithms  # 고급 연산용, 선택

5. 선택적 의존성: SDL2

디버깅용 창이나 입력 처리가 필요한 경우 SDL2를 설치합니다. ILGPU 자체는 창 없이 실행 가능하므로 필수 아님.

sudo apt-get install -y libsdl2-dev

확인:

pkg-config --modversion sdl2

윈도우와 macOS 설정

윈도우

  • 드라이버: NVIDIA 드라이버 페이지에서 데이터센터 드라이버 설치.
  • CUDA: NVIDIA CUDA 다운로드에서 CUDA Toolkit 12.2 설치.
  • .NET: Microsoft .NET 다운로드에서 .NET 8.0 SDK 설치.
  • ILGPU: NuGet 패키지 추가.
  • SDL2: SDL2 윈도우 바이너리 다운로드 및 PATH 설정.

macOS

  • 제약: H100은 macOS에서 지원되지 않으므로 Apple Silicon(M1/M2) 또는 구형 NVIDIA GPU 사용.
  • 드라이버/CUDA: NVIDIA GPU의 경우 CUDA 설치, Apple Silicon은 OpenCL 백엔드.
  • .NET: brew install dotnet-sdk
  • ILGPU: NuGet 패키지 추가.
  • SDL2: brew install sdl2

예제: ILGPU 프로젝트 설정 및 벡터 내적 테스트

환경 설정을 확인하기 위해, 두 벡터의 내적(dot product)을 계산하는 ILGPU 프로젝트를 설정하고 실행합니다. 이 예제는 H100의 CUDA 백엔드를 사용하며, .NET 8.0에서 동작합니다.

예제 코드

using ILGPU;
using ILGPU.Runtime;
using ILGPU.Runtime.Cuda;
using System;

class Program
{
    static void Main()
    {
        // 컨텍스트 초기화
        using var context = Context.Create(builder => builder.Cuda());
        using var accelerator = context.CreateCudaAccelerator(0); // H100

        // 데이터 준비
        const int size = 1000;
        float[] a = new float[size];
        float[] b = new float[size];
        Random rand = new Random();
        for (int i = 0; i < size; i++)
        {
            a[i] = (float)rand.NextDouble();
            b[i] = (float)rand.NextDouble();
        }

        // GPU 메모리 할당
        using var bufferA = accelerator.Allocate1D<float>(size);
        using var bufferB = accelerator.Allocate1D<float>(size);
        using var partialSums = accelerator.Allocate1D<float>(size); // 각 스레드의 부분 합

        // 데이터 업로드
        bufferA.CopyFromCPU(a);
        bufferB.CopyFromCPU(b);

        // 커널 정의 및 실행
        var kernel = accelerator.LoadAutoGroupedStreamKernel<
            Index1D, ArrayView<float>, ArrayView<float>, ArrayView<float>>(
            (index, a, b, partialSums) => { partialSums[index] = a[index] * b[index]; });
        kernel(size, bufferA.View, bufferB.View, partialSums.View);

        // 결과 합산 (CPU에서 최종 합산, 실제로는 GPU 내 reduction 권장)
        float[] partialResults = new float[size];
        partialSums.CopyToCPU(partialResults);
        float result = 0.0f;
        for (int i = 0; i < size; i++)
            result += partialResults[i];

        // CPU로 검증
        float expected = 0.0f;
        for (int i = 0; i < size; i++)
            expected += a[i] * b[i];

        // 결과 출력
        Console.WriteLine($"Dot Product Result: {result} (Expected: {expected})");
    }
}

설명

  • 프로젝트: 콘솔 애플리케이션, ILGPU 패키지 추가.
  • 컨텍스트: CUDA 백엔드로 H100 초기화.
  • 커널: 각 요소의 곱을 계산해 부분 합 저장, H100에서 병렬 실행.
  • 데이터: 1000 요소 벡터, HBM3 메모리 활용.
  • 합산: 간단히 CPU에서 수행, 실제 대규모 연산은 GPU 내 reduction 커널 권장.
  • 환경: Ubuntu 22.04, .NET 8.0, CUDA 12.2.

빌드 및 실행

dotnet new console -n ILGPUDotProduct
cd ILGPUDotProduct
dotnet add package ILGPU
# 위 코드로 Program.cs 작성
dotnet run

출력 예시

Dot Product Result: 123.45678 (Expected: 123.45678)

참고

  • 이 예제는 간단화를 위해 CPU에서 최종 합산을 수행했습니다. 대규모 벡터(예: 1,000,000 요소)에서는 GPU 내 reduction 커널을 추가해 성능을 최적화해야 합니다.
  • H100의 Tensor 코어는 행렬 연산에 적합하므로, 대규모 내적은 행렬 곱 형태로 재구성 가능.

문제 해결 및 최적화 팁

설치와 실행 중 발생할 수 있는 문제를 해결하고 H100에서 ILGPU를 최적화하는 팁을 제공합니다:

문제 해결

드라이버/CUDA 오류:

  • nvidia-smi로 H100 인식 확인.
  • CUDA 버전 불일치 시: sudo apt-get install -y cuda-12-2

.NET 명령어 인식 실패:

echo 'export PATH=$PATH:/usr/share/dotnet' >> ~/.bashrc
source ~/.bashrc

ILGPU 런타임 오류:

  • CUDA 라이브러리 경로 확인: export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
  • NuGet 패키지 최신 버전 사용: dotnet add package ILGPU --version 1.5.1

H100 최적화 팁

  • Tensor 코어: ILGPU.Algorithms 패키지로 행렬 연산 가속, 내적을 행렬 곱으로 변환.
  • 메모리: HBM3의 3TB/s 대역폭 활용, Allocate1D로 연속 메모리 할당.
  • 스레드: H100의 132 SM에 맞게 블록 크기 조정(예: 256 스레드/블록).
  • 비동기: CUDA 스트림으로 메모리 전송과 커널 실행 병렬화: accelerator.Synchronize();

결론

리눅스(Ubuntu 22.04)에서 H100 GPU를 위한 ILGPU 환경 설정은 NVIDIA 드라이버, CUDA Toolkit, .NET 8.0, ILGPU NuGet 패키지 설치로 완료됩니다. 윈도우와 macOS에서도 유사한 설정이 가능하며, SDL2는 디버깅용으로 선택적입니다. 벡터 내적 예제는 ILGPU의 설정을 확인하고 H100의 CUDA 백엔드 성능을 체험하는 첫걸음입니다. 다음 섹션에서는 ILGPU의 기본 사용법을 더 깊이 다루며, 행렬 곱과 희소 행렬 연산 같은 복잡한 커널을 구현하여 H100의 잠재력을 탐구할 것입니다.

ILGPU 시리즈 요약으로 돌아가기