AI 런타임의 내부: PyTorch, C++, CUDA 및 그 이상

마지막 업데이트 : 02/15/2026
  • PyTorch의 런타임 레이어는 ATen 텐서, 자동 미분, C++ 프런트엔드, TorchScript 및 CUDA 통합을 포함하며, Python 및 네이티브 C++ API를 모두 제공합니다.
  • C++ 및 CUDA 확장 기능을 사용하면 자동 미분, TorchScript 및 고급 사용 편의성을 유지하면서 CUTLASS와 같은 사용자 지정 커널 및 라이브러리를 플러그인할 수 있습니다.
  • 정밀 제어, 그래프, 사용자 지정 할당자 및 메모리 튜닝과 같은 고급 CUDA 기능은 최신 GPU에서 모델을 확장하는 데 핵심적인 역할을 합니다.
  • NVIDIA의 VibeTensor와 같은 실험적인 프로젝트는 Python, JavaScript, C++ 및 CUDA 전반에 걸쳐 PyTorch의 아키텍처를 반영하는 AI 기반 런타임을 탐구합니다.

PyTorch, JavaScript, C++, CUDA를 사용한 AI 런타임

최신 AI 런타임은 Python, C++, JavaScript 및 CUDA 기반 GPU의 교차점에 있으며, PyTorch는 이러한 모든 영역을 효율적으로 통합하는 방법에 대한 사실상의 표준 사례가 되었습니다. 겉보기에는 단순해 보이는 파이썬 API 뒤에는 정교한 C++ 코어, 자동 미분 엔진, JIT 컴파일러, CUDA 통합, 그리고 NVIDIA의 VibeTensor와 같은 실험적인 런타임까지 탑재되어 있어 AI가 생성한 코드가 어디까지 발전할 수 있는지 탐구합니다.

고성능 AI 시스템을 구축하는 경우, PyTorch의 C++ 런타임, CUDA 백엔드, TorchScript, C++ 확장 기능 및 메모리 관리 방식을 이해하는 것이 "실행은 되지만 확장성이 떨어지고 속도가 매우 빠르다"는 차이를 만드는 핵심 요소입니다. 이 가이드에서는 이러한 계층들을 살펴보고, 파이썬 및 자바스크립트 환경과의 관계를 설명하며, CUDA 도구 및 AI 지원 런타임과 같은 새로운 접근 방식과 연결하는 방법을 안내합니다.

PyTorch 런타임: Python API부터 C++ 및 CUDA까지

PyTorch는 언뜻 보기에 순수한 Python 라이브러리처럼 보이지만, 실제로는 C++로 작성된 핵심 구조를 가진 계층형 런타임이며, CUDA 및 cuDNN, NCCL, oneDNN, Intel MKL과 같은 최적화 라이브러리와 긴밀하게 통합되어 있습니다. 파이썬은 주로 작업을 조율하는 역할을 하며, 실제 핵심 작업은 CPU와 GPU의 네이티브 코드가 수행합니다.

크게 보면 PyTorch는 텐서 라이브러리, 자동 미분 엔진, 신경망 유틸리티, JIT 컴파일러(TorchScript), 멀티프로세싱 도우미, 데이터 로딩 및 직렬화를 위한 유틸리티 모음 등 여러 핵심 구성 요소로 이루어져 있다고 생각할 수 있습니다. 이 둘을 함께 사용하면 NumPy와 유사한 텐서 인터페이스와 유연한 딥러닝 플랫폼을 모두 제공합니다.

공개 C++ API는 이 아키텍처를 대략적으로 반영하며 ATen, Autograd, C++ 프런트엔드, TorchScript 바인딩 및 C++ 확장 기능으로 나뉘어 있으며, 각각 컴퓨팅 스택의 특정 계층을 다룹니다. 파이썬을 넘어 C++ 또는 CUDA 커널과 같은 사용자 지정 라이브러리를 통합하거나, 바인딩을 통해 Node.js 또는 브라우저 런타임과 같은 환경에 모델을 노출하려면 이러한 구성 요소를 이해하는 것이 필수적입니다.

모든 것의 근간에서 PyTorch는 NVIDIA CUDA 툴킷을 활용합니다. 이 툴킷은 컴파일러, GPU 가속 수학 라이브러리, 디버깅 및 프로파일링 도구, 그리고 torch.cuda와 사용자 정의 확장 프로그램에서 사용하는 CUDA 런타임을 제공합니다. 이 툴킷은 궁극적으로 PyTorch가 데이터 센터, 워크스테이션 및 임베디드 시스템에서 최신 GPU를 최대한 활용할 수 있도록 해주는 핵심 요소입니다.

CUDA를 사용하는 PyTorch 런타임 아키텍처

ATen: 텐서 및 연산자 핵심 구성 요소

ATen은 PyTorch에서 거의 모든 텐서 연산을 지원하는 저수준 텐서 라이브러리로, Python에서 호출하든 C++에서 호출하든 상관없이 사용할 수 있습니다. 핵심을 정의합니다 at::Tensor 타입 외에도 수백 가지의 수학, 인덱싱, 선형 대수 및 축소 연산이 CPU와 GPU 모두에서 구현되어 있습니다.

각 ATen 텐서는 장치 및 데이터 유형 메타데이터를 포함하며, CPU 또는 CUDA 구현으로의 디스패칭은 해당 메타데이터를 기반으로 동적으로 이루어지므로 동일한 C++ 연산자 심볼이 서로 다른 백엔드에서 원활하게 실행될 수 있습니다. 이것이 바로 데이터를 이동할 수 있게 해주는 것입니다. .to("cuda") or .cuda() 파이썬에서 실제 호출하는 연산을 변경하지 않고도 가능합니다.

ATen은 C++ API를 통해 직접 사용할 수 있지만 (모든 것이 그 안에 있습니다) at:: 일반적인 워크플로에서는 네임스페이스와 같은 상위 수준 모듈을 통해서만 ATen을 간접적으로 사용하게 됩니다. torch, torch.nn 또는 C++ 프런트엔드. 하지만 성능이 중요한 코드나 사용자 정의 커널의 경우, ATen 수준에서 작업하는 것이 가장 큰 제어권을 얻을 수 있는 방법입니다.

ATen은 빠른 벡터화 커널, 강력한 GPU 가속 및 우수한 CPU 성능을 강조하도록 설계되어 연구용 프로토타입 제작과 실제 운영 환경 모두에 적합합니다. 내부적으로는 이미 잘 최적화된 수학적 방법을 새로 개발하는 대신, 적절한 경우 벤더 라이브러리(MKL, cuBLAS, cuDNN 등)를 활용합니다.

Autograd: 텐서 기반 자동 미분

Autograd는 ATen 텐서에 기울기 추적 기능을 추가하여 순수 텐서 연산을 미분 가능한 계산 그래프로 변환하는 하위 시스템입니다. 자동 미분 기능이 활성화되면 텐서에 대한 연산은 내부 그래프를 생성하며, 이 그래프를 역방향으로 탐색하여 학습을 위한 기울기를 계산할 수 있습니다.

자동 미분 엔진은 흔히 "테이프" 또는 역모드 미분 그래프라고 불리는 개념을 기반으로 구축되었으며, 이 개념에서는 순방향 패스 중에 중간 연산이 기록되고 필요에 따라 역방향으로 재생됩니다. 호출 .backward() 그래디언트가 있는 리프 텐서에서 그래프 탐색을 시작하고 미분값을 매개변수에 누적합니다.

중요한 미묘한 점은 원재료가 at::Tensor ATen 타입은 기본적으로 미분 불가능하므로 C++에서 기울기 인식 텐서를 사용하려면 다음을 사용해야 합니다. torch:: 네임스페이스 팩토리 함수(예: torch::ones) 대신에 at:: 공장. 전자는 자동 미분 시스템에 연결된 텐서를 생성하는 반면, 후자는 순전히 수치적인 방식으로만 작동합니다.

이러한 분리는 의도적인 것입니다. 이를 통해 자동 미분 오버헤드가 발생할지 여부를 선택할 수 있으며, 이는 기울기가 필요하지 않은 추론 전용 경로 또는 지연 시간이 짧은 경로에 매우 중요합니다. C++ 프런트엔드와 TorchScript 그래프에서도 동일한 구분이 유지됩니다.

PyTorch용 자동 미분 및 CUDA 런타임

C++ 프런트엔드: 파이썬 없이 모델 구축 및 학습

PyTorch C++ 프런트엔드는 대부분의 기능을 반영하는 고수준 API입니다. torch.nn, torch.optim, torch.utils.data 관련 파이썬 모듈도 포함되어 있지만, 관용적인 최신 C++로 구현되었습니다. 이 소프트웨어는 네이티브 성능이 필요하거나, 기존 C++ 시스템과의 긴밀한 통합이 필요하거나, Python이 없는 배포 환경이 필요한 시나리오를 위해 설계되었습니다.

C++ 프런트엔드를 사용하면, 모델은 모듈 계층 구조로 정의됩니다. 이는 기존 방식과 동일합니다. torch.nn.Module클래스 내부에 등록된 매개변수들이 더 큰 네트워크로 구성됩니다. 컨볼루션, RNN, 배치 정규화, 선형 레이어 등 파이썬의 해당 레이어와 거의 동일하게 동작하는 "표준 라이브러리"가 있습니다.

프런트엔드는 SGD, Adam, RMSprop과 같은 고전적인 알고리즘을 사용하는 최적화 API, 데이터셋 추상화, 여러 CPU 스레드에서 데이터를 스트리밍할 수 있는 데이터 로더, 그리고 체크포인트 직렬화를 위한 유틸리티를 제공합니다. 기본적으로 파이썬으로 학습 루프를 작성하는 방법을 알고 있다면 (그리고 다음과 같은 문제를 피할 수 있다면) 과적 합 vs 과소 적합), 이를 C++ 프런트엔드로 포팅하는 것은 대부분 기계적인 작업입니다.

멀티 GPU 시스템에서 C++ 프런트엔드는 여러 CUDA 장치에 걸쳐 모델을 자동으로 병렬화하는 데 도움이 되는 기능을 다음과 유사한 방식으로 제공합니다. torch.nn.parallel.DataParallel. 또한 하이브리드 워크플로우를 원하는 경우 pybind11을 사용하여 C++ 모델을 Python에 다시 바인딩하는 지원 코드도 포함되어 있습니다.

TorchScript: JIT 컴파일 및 Python 없이 실행 가능

TorchScript는 Python의 정적 분석 가능한 하위 집합과 PyTorch API를 결합한 것으로, 컴파일, 최적화 및 직렬화하여 배포할 수 있습니다. 개념적으로, 이는 모델에서 일반적으로 사용되는 텐서 연산 및 제어 흐름 구조를 중심으로 설계된 소규모 프로그래밍 언어입니다.

C++ 측면에서 TorchScript는 세 가지 주요 기능을 제공합니다. Python에서 생성된 직렬화된 모델을 로드하고 실행하는 기능, TorchScript 표준 라이브러리를 확장하는 사용자 지정 연산자를 정의하는 기능, 그리고 C++에서 TorchScript 소스 코드를 직접 컴파일하는 기능입니다. 이 모든 것은 다음을 통해 이용할 수 있습니다. torch::jit 네임 스페이스.

일반적인 프로덕션 패턴은 모델을 완전히 Python으로 작성하고 학습시킨 다음, TorchScript 모듈로 내보내고, Python 런타임에 의존하지 않고 지연 시간이 짧은 추론을 수행하는 C++ 서비스에 해당 모듈을 포함하는 것입니다. 이는 컨테이너화된 마이크로서비스 및 성능에 민감한 백엔드에 특히 매력적입니다.

고급 사용자는 CUDA 가속 커널을 포함한 사용자 지정 연산자를 등록할 수 있으며, TorchScript는 이를 내장 연산자처럼 호출할 수 있습니다. 이러한 사용자 지정 연산자는 직렬화 가능하며, 올바르게 등록하면 Python 및 C++ 환경 모두에서 작동합니다. 마지막으로, 다음과 같은 기능 torch::jit::compile C++ 문자열이나 AST와 유사한 구조로부터 TorchScript 모듈을 즉시 생성할 수 있습니다.

C++ 및 CUDA 확장: 사용자 지정 커널 플러그인

PyTorch의 C++ 확장 메커니즘은 ATen, 자동 미분 및 디스패처를 활용하면서 일반 Python 워크플로에 사용자 지정 C++ 및 CUDA 코드를 삽입할 수 있는 간단한 방법을 제공합니다. 일반적으로 이러한 확장 기능은 사용자 지정 연산자를 구현하거나 내장 연산자로는 제대로 처리하기 어려운 특수 워크로드를 가속화하는 데 사용됩니다.

확장 API 자체는 새로운 텐서 의미론을 도입하지 않습니다. 대신, setuptools 또는 다른 백엔드를 통해 코드를 Python의 패키징 시스템과 PyTorch의 JIT 컴파일 도구에 연결하여 커널이 올바른 ABI 및 링크 플래그로 컴파일되도록 합니다. 내부적으로는 다음과 같은 도우미들이 있습니다. CUDAExtension nvcc에 대한 기본 코드를 추가하고, 포함 경로 및 링크 옵션을 지정합니다.

바인딩 측면에서 pybind11은 일반적으로 C++ 함수 또는 클래스를 Python 심볼로 노출하는 데 사용되며, 이러한 바인딩은 다음과 상호 작용합니다. torch::Tensor 파이썬 텐서와 저장 공간을 공유하는 객체입니다. 이렇게 하면 데이터 복사가 최소화되고, 역방향 전달을 올바르게 구현하면 자동 미분이 새로운 연산자를 인식할 수 있습니다.

컴파일이 완료되면 이러한 확장 기능은 일반 Python 모듈처럼 작동하며, 학습 스크립트에서 가져올 수 있고, JIT 사용을 위해 연산을 등록하면 TorchScript와도 잘 호환됩니다. CUDA 사용량이 많은 연구의 경우, 이 방법은 파이썬의 생산성을 유지하면서 새로운 커널을 실험하는 가장 빠른 방법인 경우가 많습니다.

Torch와 CUDA 라이브러리 연결: CUTLASS를 사용한 GEMM 예제

NVIDIA GPU의 성능을 최대한 활용해야 할 때, PyTorch의 텐서 런타임을 CUTLASS와 같은 고도로 최적화된 CUDA C++ 라이브러리 또는 내장 연산으로 제공되지 않는 사용자 지정 커널과 연결하는 것이 일반적입니다. 대표적인 예로는 최적화된 GEMM(행렬 곱셈) 연산자를 작성하는 것이 있습니다.

일반적인 패턴은 다음과 같은 인수를 받는 C++ 래퍼 함수를 ​​작성하는 것입니다. torch::Tensor 입력값을 받아 모양, 데이터 유형 및 데이터 포인터를 추출하고 이를 CUTLASS 또는 다른 CUDA 라이브러리 함수로 전달합니다. 텐서의 차원은 다음을 통해 얻어집니다. .sizes()데이터 유형은 다음을 통해 .dtype()그리고 원시 포인터를 통해 .data_ptr() (선택적으로 다음과 결합 가능) reinterpret_cast 사용자 지정 유형이 필요한 경우 cutlass::half_t).

C++에서 템플릿 매개변수는 컴파일 시간에 해석되지만, 텐서 데이터 유형은 런타임에만 알 수 있기 때문에, 래퍼에는 일반적으로 텐서의 데이터 유형에 따라 올바른 템플릿 인스턴스화(float16, float32 등)를 선택하는 조건부 디스패치 로직이 포함됩니다. 복잡한 템플릿 계층 구조의 경우, 많은 분기문을 직접 작성하는 것을 피하기 위해 파이썬 스크립트를 사용하여 해당 상용구 코드를 생성하는 경우가 많습니다.

입력 유효성 검사는 매우 중요합니다. 텐서는 GEMM에서 사용 가능한 형태를 가져야 하고, CUDA 장치에 저장되어야 하며, 메모리에서 연속적이어야 합니다. CUTLASS는 인접한 요소들이 순차적으로 배치될 것으로 예상하기 때문입니다. 인접성은 다음을 통해 확인할 수 있습니다. .is_contiguous() 그리고 다음을 사용하여 수정합니다. .contiguous()제자리 의미론이 필요한 경우, 결과를 원래 텐서에 다시 복사합니다.

PyTorch의 스타일에 맞추기 위해 일반적으로 출력 텐서를 선택 사항으로 만듭니다. c10::optional<torch::Tensor>만약 아무것도 제공되지 않으면, 적절한 권한을 가진 새로운 권한을 할당합니다. device dtype ATen 팩토리 함수를 사용합니다. 해당 텐서를 반환하면 API가 내장 연산자와 대칭성을 유지합니다. torch.mm.

PyBind11과 setuptools를 사용하여 CUDA 확장 기능을 바인딩하고 빌드하는 방법

C++ 래퍼가 준비되면 이를 Python에 바인딩하고 컴파일해야 하는데, 이때 pybind11과 PyTorch의 빌드 유틸리티가 사용됩니다. pybind11 모듈은 일반적으로 다음과 같은 함수를 선언합니다. m.def("cutlass_gemm", &cutlass_gemm, "GEMM with CUTLASS", py::arg("A"), py::arg("B"), py::arg("out") = py::none()); C++ 함수를 Python 코드에서 사용할 수 있도록 노출시키려면 다음과 같이 합니다.

빌드 측면에서, 일반적인 setuptools는 nvcc를 기본적으로 이해하지 못하므로 PyTorch는 nvcc를 지원하는 헬퍼 클래스를 제공합니다. CUDAExtension libtorch에 대한 포함 경로, CUDA 컴파일 플래그 및 링크를 자동으로 구성합니다. 당신은 당신의 것을 통과합니다 .cpp .cu 출처 CUDAExtension 일반적인 설정 도구와 매우 유사합니다. Extension.

확장 프로그램이 설치되면 파이썬 코드는 이를 일반 모듈처럼 가져올 수 있으며, 그 시점부터 사용자 정의 연산자를 호출하는 방식은 내장 PyTorch 연산자를 호출하는 방식과 거의 동일합니다. PyTorch의 규칙을 준수하는 한, autograd, TorchScript 및 CUDA 스트림과의 상호 운용 기능을 유지할 수 있습니다.

빌드 자체에 PyTorch를 사용하지 않으려는 경우(예: CUDA 라이브러리가 여러 프레임워크를 대상으로 하는 경우), CMake와 함께 scikit-build-core와 같은 대체 백엔드를 사용하거나 setuptools에서 nvcc 통합을 수동으로 구성할 수 있습니다. CUDAExtension PyTorch 사용자에게는 단연코 가장 간단한 방법입니다.

CUDA 툴킷: 컴파일러, 라이브러리 및 런타임 레이어

NVIDIA CUDA 툴킷은 C/C++ 컴파일러, GPU에 최적화된 수치 라이브러리, 디버깅 및 프로파일링 도구, 그리고 PyTorch에서 사용하는 저수준 런타임을 제공하여 PyTorch의 GPU 런타임을 지원합니다. torch.cuda 및 사용자 지정 확장 기능. 이 제품은 임베디드 보드부터 클라우드 클러스터에 이르기까지 광범위한 플랫폼을 대상으로 합니다.

PyTorch는 무거운 선형 대수, 컨볼루션 및 FFT 워크로드를 CUDA 라이브러리에 위임함으로써 각 GPU 아키텍처의 특성을 잘 알고 있는 고도로 최적화된 구현을 활용하여 단순한 GPU 코드로는 달성할 수 없는 성능을 끌어낼 수 있습니다. 많은 AI 워크로드의 경우, 이것이 바로 PyTorch가 새로운 GPU 세대에서 뛰어난 확장성을 보이는 주요 이유입니다.

CUDA 확장 기능을 작성하는 개발자는 여전히 일반적으로 nvcc로 컴파일된 C++ 커널을 작성하며, 이를 PyTorch에 바인딩하면 공유 라이브러리를 호출하는 Python, C++ 또는 JavaScript 런타임에서 해당 커널을 오케스트레이션할 수 있습니다. 이는 기존 C++ 또는 CUDA 코드베이스를 보유하고 있지만 PyTorch 스타일 API를 통해 이를 노출하려는 팀에게 최적의 선택입니다.

torch.cuda: 장치 선택, 정밀도 모드 및 실행 모델

The torch.cuda 이 모듈은 PyTorch에서 CUDA로 접근하는 사용자 인터페이스 역할을 하며, 장치 선택, 스트림 관리, 메모리 할당 및 런타임 구성을 처리합니다. 모든 CUDA 텐서는 기본적으로 현재 선택된 장치를 사용하며, 이는 다음을 사용하여 변경할 수 있습니다. torch.cuda.device 컨텍스트 관리자로서 또는 특정 장치를 명시적으로 대상으로 지정하여 사용할 수 있습니다.

GPU 간 연산은 의도적으로 제한됩니다. 복사 유사 연산(예: ...)을 제외하고는 말입니다. copy_(), to(), cuda()대부분의 작업은 미묘한 성능 및 정확성 문제를 방지하기 위해 피어 투 피어 메모리 액세스가 활성화되지 않으면 장치 간에 수행할 수 없습니다. 텐서는 자신이 속한 장치를 추적하며, 출력은 입력과 동일한 장치에 유지됩니다.

PyTorch는 Ampere 및 이후 GPU의 TensorFloat-32(TF32)를 포함한 CUDA 백엔드에서 계산 정밀도에 대한 자세한 제어 기능을 제공하며, FP16 및 BF16 GEMM에 대한 정밀도 감소 옵션과 하드웨어에서 지원하는 경우 전체 FP16 누적 옵션도 제공합니다. 이러한 플래그는 백엔드(CUDA, cuDNN)별로, 심지어 연산자별로도 조정할 수 있으므로 수치 정확도와 속도 사이에서 균형을 맞출 수 있습니다.

GPU 연산은 기본적으로 비동기식입니다. CUDA 연산을 호출하면 장치 스트림에 대기열에 추가되지만 나중에 실행될 수 있으므로 CPU 연산, 데이터 전송 및 커널이 겹칠 수 있습니다. 이러한 코드의 타이밍을 정확하게 맞추려면 명시적인 조치가 필요합니다. torch.cuda.synchronize() 호출 또는 CUDA 이벤트 사용, 환경 변수 등 CUDA_LAUNCH_BLOCKING=1 디버깅에는 유용하지만 성능 테스트에는 적합하지 않습니다.

보다 고급 사용 사례의 경우, PyTorch는 CUDA 스트림 및 이벤트를 제공하여 여러 병렬 스트림을 오케스트레이션하고, 선택적으로 동기화하며, 텐서에 대한 모든 보류 중인 작업이 완료되기 전에 텐서가 할당 해제되지 않도록 할 수 있습니다. 다음과 같은 기능 record_stream() wait_stream() 이러한 패턴의 핵심은 바로 이것입니다.

CUDA 메모리 관리, 할당자 및 튜닝 옵션

PyTorch는 CUDA 장치에서 캐싱 할당자를 사용하여 GPU와의 지속적인 동기화 없이 빈번한 할당 및 할당 해제를 빠르게 처리합니다(참조). C++에서 메모리가 작동하는 방식 (관련 개념에 대해서는 해당 내용을 참조하십시오.) 전화하는 대신 cudaMalloc cudaFree 각 텐서마다, 할당 간에 재사용할 수 있는 메모리 블록 풀을 유지합니다.

결과적으로 다음과 같은 도구들이 등장했습니다. nvidia-smi 텐서가 실제로 차지하는 메모리보다 "사용 중"인 메모리가 더 많이 표시되는 경우가 있는데, 이는 일부 메모리가 할당자에 의해 예약되었지만 현재 할당되지 않았기 때문입니다. 다음과 같은 기능 memory_allocated(), max_memory_allocated(), memory_reserved() max_memory_reserved() 실시간 텐서 사용량과 캐시된 용량을 구분하는 데 도움이 됩니다.

사용하지 않는 캐시 메모리는 다음을 통해 해제할 수 있습니다. torch.cuda.empty_cache()이는 블록을 CUDA 드라이버에 반환하지만 활성 텐서가 여전히 소유하고 있는 메모리는 해제하지 않습니다. 더 자세히 살펴보려면, memory_stats() memory_snapshot() 파편화 또는 OOM(자원 부족) 문제를 해결할 때 매우 중요할 수 있는 저수준 할당 정보를 제공합니다.

할당자의 동작은 다음을 통해 조정할 수 있습니다. PYTORCH_ALLOC_CONF (또는 별칭 PYTORCH_CUDA_ALLOC_CONF) 환경 변수를 사용하면 백엔드 구현을 선택하고, 분할 크기, 반올림 전략, 가비지 컬렉션 임계값 등을 조정할 수 있습니다. CUDA를 사용하는 옵션도 있습니다. cudaMallocAsync지원되는 툴킷에서 대체 백엔드로 사용할 수 있는 -기반 할당자입니다.

PyTorch는 내장된 할당자 외에도 C 또는 C++로 작성된 공유 라이브러리를 통해 플러그형 CUDA 할당자를 지원합니다. 이러한 기능은 NCCL의 NVLink 스위치 감소 또는 사용자 정의 CPU-GPU 메모리 배치 전략과 같은 외부 시스템과 통합될 수 있으며, Python을 통해 사용할 수 있습니다. torch.cuda.memory.CUDAPluggableAllocator torch.cuda.MemPool.

CUDA 그래프 및 성능 중심의 모범 사례

CUDA 그래프는 GPU 연산 배치를 그래프로 캡처하고 단일 실행 호출로 재생하여 CPU 오버헤드를 줄이는 강력한 기능입니다. PyTorch는 다음을 통해 이 기능을 통합합니다. torch.cuda.CUDAGraph 밸리 torch.cuda.graph 컨텍스트 관리자 및 torch.cuda.make_graphed_callables() 돕는 사람.

그래프 캡처는 워크로드의 형태가 정적이고 제어 흐름이 결정론적이며 핫 패스에서 CPU-GPU 동기화가 없을 때 가장 효과적입니다. 캡처 과정에서는 GPU 작업이 실행되는 것이 아니라 기록되며, 재생 시에는 정확히 동일한 커널 시퀀스가 ​​실행되어 동일한 가상 주소에서 읽고 씁니다.

캡처된 그래프는 고정된 텐서 레이아웃을 가정하므로, PyTorch는 그래프 전용 메모리 풀을 할당하며, 이 풀의 수명은 해당 그래프에 따라 결정됩니다. CUDAGraph 객체와 캡처 내부에서 생성된 텐서에 대해. 이러한 풀은 관련 그래프 간에 공유하여 메모리를 절약할 수 있습니다. 단, 일관된 실행 순서와 동시 실행 방지를 보장해야 합니다.

분산 환경에서, 특히 다음과 같은 경우 DistributedDataParallel NCCL 및 CUDA Graph 통합에는 호환되는 NCCL 버전을 확인하고, 특정 비동기 오류 처리기를 비활성화하고, 집합 연산을 안전하게 캡처할 수 있도록 워밍업 단계를 처리하는 등 몇 가지 주의 사항이 필요합니다. 제대로 구현하면 안정적이고 생산 수준의 학습 루프에 대한 처리량을 크게 향상시킬 수 있습니다.

그래프 외에도 PyTorch 문서에서는 호스트-GPU 간 데이터 전송 속도를 높이기 위해 CPU 메모리를 고정(pinning)하는 것을 권장합니다. DistributedDataParallel 위에 DataParallel 또는 멀티 GPU 학습을 위한 단순한 멀티프로세싱, 그리고 CPU와 GPU 간에 깔끔하게 전환되는 장치에 구애받지 않는 코드 작성 등을 통해 torch.device. 이러한 방법들을 종합적으로 활용하면 인체공학적 설계와 성능 향상 사이의 최적의 균형점을 찾을 수 있습니다.

설치, 빌드 옵션 및 하드웨어 백엔드

PyTorch는 Conda, pip wheels 또는 소스 코드를 통해 설치할 수 있으며, 일반적인 Linux, macOS 및 Windows 설정용 사전 빌드된 바이너리와 NVIDIA Jetson 플랫폼용 특수 빌드가 제공됩니다. 각 배포판은 공개된 지원 매트릭스에 따라 특정 CUDA 버전을 대상으로 합니다.

소스 코드에서 빌드하려면 Python 3.10 이상, 최신 C++17 지원 컴파일러(예: Linux의 경우 GCC 9.4 이상), 그리고 Windows에서 사용할 적절한 툴체인(Visual Studio 또는 독립 실행형 빌드 도구)이 필요합니다. 해당 SDK를 설치하고 다음과 같은 플래그를 설정하여 CUDA, ROCm(AMD GPU용) 또는 Intel GPU 지원을 포함하거나 포함하지 않고 컴파일할 수 있습니다. USE_CUDA, USE_ROCM USE_XPU.

CPU 전용 빌드의 경우, 특히 Windows 환경에서 CMake가 기본 MSVC 런타임으로 되돌아갈 수 있으므로, 원하는 OpenMP 구현(대개 Intel OpenMP) 및 BLAS 라이브러리를 링크하는 데 특별한 주의가 필요할 수 있습니다. CUDA 빌드의 경우, Magma 또는 oneDNN과 같은 추가 라이브러리를 사용하여 특정 연산 속도를 향상시킬 수 있습니다.

PyTorch는 CUDA 및 cuDNN 환경이 사전 구성된 Docker 이미지도 제공합니다(자세한 내용은 참조). 컨테이너화 소개이러한 이미지는 멀티프로세싱 데이터 로더를 위해 공유 메모리 세그먼트에 의존하므로 공유 메모리를 늘려야 하는 경우가 많습니다. --ipc=host or --shm-size on docker run. Docker 및 NVIDIA 드라이버 버전이 CUDA 툴킷 버전과 호환되는지 확인하는 것은 필수입니다.

문서 자체는 Sphinx와 사용자 지정 테마를 사용하여 구축되었으며, 필요한 Python 종속성, TeX 도구 및 PyTorch 패키지를 로컬 환경에 설치하면 HTML 또는 PDF 형식으로 생성할 수 있습니다. 이 기능은 새 모듈이나 독스트링을 추가하고 상위 프로젝트에 기여하기 전에 미리 보려는 경우에 유용합니다.

VibeTensor: PyTorch에서 영감을 받은 AI 생성 런타임

NVIDIA의 VibeTensor 프로젝트는 런타임에 대한 다른 관점을 보여줍니다. 이는 PyTorch와 개념적으로 유사한 실험적인 실행 환경으로, 코드 기반 대부분이 인간의 감독 하에 AI 에이전트에 의해 생성되었습니다. 이 실험의 목적은 인공지능 비서에 크게 의존하여 코드를 작성하는 "바이브 코딩" 방식이 복잡한 시스템에서 얼마나 효과적으로 활용될 수 있는지 알아보는 것입니다.

VibeTensor의 아키텍처는 Python 및 JavaScript 친화적인 API와 C++ 런타임 코어, 사용자 정의 텐서 스토리지 할당자, 자동 미분 엔진, 디스패처, 고급 인덱싱 하위 시스템 및 CUDA 기반 메모리 캐시를 결합하며, 이 모든 것은 Linux x86_64 및 NVIDIA GPU를 대상으로 합니다. 심지어 멀티 GPU 실행을 위해 CUDA P2P를 사용하는 실험적인 Fabric 서브시스템도 있습니다.

이 프로젝트는 또한 향후 출시될 블랙웰 아키텍처(SM100/SM103)용 백엔드와 같은 외부 GPU 플러그인을 지원하며, 사람이 제약 조건과 유효성 검사를 제공하는 한 이러한 플러그인 자체도 AI 생성 코드로 부트스트랩할 수 있음을 보여줍니다. 현재 성능과 기능 면에서 PyTorch에 필적하지는 않지만, 이 프로젝트는 AI 지원 시스템 프로그래밍에 대한 개념 증명 역할을 합니다.

약 두 달간의 개발 기간 동안, 인간 엔지니어들은 주로 작업, 제약 조건 및 검토 주기를 정의하는 데 집중했고, AI 에이전트는 반복적으로 코드를 생성하고, 비교를 수행하고, 컴파일하고, 테스트하고, 구현을 개선했습니다. 이 하이브리드 워크플로는 AI의 강력한 기능과 한계를 모두 보여줍니다. 대부분의 정형화되고 반복적인 패턴은 자동화할 수 있지만, 정확성과 아키텍처는 여전히 인간의 판단을 필요로 합니다.

실무자에게 있어 VibeTensor는 PyTorch를 단순히 대체하는 도구라기보다는, 특히 Python, JavaScript, C++, CUDA가 혼합된 환경에서 AI가 런타임의 설계 및 진화에 깊이 관여할 때 미래의 런타임이 어떤 모습일지 탐구하는 도구에 가깝습니다. 이는 특정 작업 부하에 특화된 런타임을 이전보다 훨씬 빠르게 구축할 수 있는 세상을 암시합니다.

이 모든 요소들을 종합해 보면, 즉 PyTorch의 텐서 및 자동 미분 코어, C++ 프런트엔드, TorchScript, C++ 및 CUDA 확장 기능, 정교하게 조정된 CUDA 통합, 그리고 VibeTensor와 같은 실험적인 프로젝트들을 통해 Python, C++, JavaScript, CUDA가 긴밀하게 융합된 AI 런타임 생태계를 그려볼 수 있습니다. 개발자들은 자신의 작업 부하에 맞춰 생산성, 제어력, 그리고 순수 성능의 균형을 가장 잘 맞출 수 있는 레이어를 유연하게 선택할 수 있습니다.

과적 합 vs 과소 적합
관련 기사 :
과적합과 과소적합: 세 가지 문제 모두 해결, 원인 및 해결 방법
관련 게시물: