12월 2일, PyTorch 2.0이 공식 출시되었습니다!
이 업데이트는 PyTorch의 성능을 새로운 차원으로 끌어올릴 뿐만 아니라 동적 모양 및 분포에 대한 지원도 추가합니다.
또한 2.0 시리즈에서는 일부 PyTorch 코드를 C++에서 Python으로 다시 이동할 예정입니다.
현재 PyTorch 2.0은 아직 테스트 단계에 있으며 첫 번째 안정 버전은 2023년 3월 초에 출시될 예정입니다.
지난 몇 년 동안 PyTorch는 1.0부터 최근 1.13까지 혁신과 반복을 거쳐 새로 형성된 PyTorch 재단으로 이동하여 Linux 재단의 일부가 되었습니다.
현재 버전의 PyTorch의 문제점은 열성 모드가 계속 증가하는 GPU 대역폭과 더 열악한 모델 아키텍처를 따라잡는 데 어려움을 겪는다는 것입니다.
PyTorch 2.0의 탄생은 PyTorch가 컴파일러 수준에서 실행되는 방식을 근본적으로 바꾸고 개선할 것입니다.
우리 모두 알고 있듯이 PyTorch의 (Py)는 데이터 과학에서 널리 사용되는 오픈 소스 Python 프로그래밍 언어에서 유래되었습니다.
하지만 PyTorch의 코드는 Python을 완전히 사용하지 않고 일부를 C++에 제공합니다.
그러나 향후 2.x 시리즈에서 PyTorch 프로젝트 팀은 torch.nn 관련 코드를 다시 Python으로 이동할 계획입니다.
게다가 PyTorch 2.0은 완전한 추가 기능(및 선택 사항) 기능이므로 2.0은 이전 버전과 100% 호환됩니다.
즉, 코드 베이스도 같고, API도 같고, 모델을 작성하는 방식도 같습니다.
PyTorch 프로그램을 안전하게 캡처하기 위해 Python 프레임워크 평가 후크를 사용하는 것은 지난 5년 동안 그래프 캡처 팀에서 개발한 주요 혁신입니다.
예측 역추적을 생성하기 위한 추적 자동 비교로 PyTorch의 autograd 엔진을 오버로드합니다.
는 ~2000개 이상의 PyTorch 연산자를 개발자가 완전한 PyTorch 백엔드를 구축할 수 있는 ~250개의 기본 연산자의 닫힌 세트로 요약합니다. PyTorch 기능이나 백엔드 작성에 대한 장벽이 크게 낮아졌습니다.
여러 가속기와 백엔드를 위한 빠른 코드를 생성할 수 있는 딥 러닝 컴파일러입니다. Nvidia GPU의 경우 OpenAI Triton을 핵심 빌딩 블록으로 사용합니다.
TorchDynamo, AOTAutograd, PrimTorch 및 TorchInductor가 모두 Python으로 작성되었으며 동적 모양을 지원한다는 점은 주목할 가치가 있습니다.
새로운 컴파일 모드 "torch.compile"을 도입함으로써 PyTorch 2.0은 코드 한 줄로 모델 훈련을 가속화할 수 있습니다.
여기에는 트릭이 필요하지 않습니다. 그냥 torch.compile()을 실행하면 됩니다:
opt_module = torch.compile(module)
이러한 기술을 검증하기 위해 팀은 이미지 분류, 객체 감지, 이미지 생성 등의 작업은 물론 언어 모델링, 질문 답변, 시퀀스 분류, 추천 시스템 등 다양한 NLP 작업을 포함하는 테스트 벤치마크를 신중하게 생성했습니다. , 강화 학습 등이 있습니다. 그중 벤치마크는 세 가지 범주로 나눌 수 있습니다.
테스트 결과에 따르면 비전, NLP 및 기타 분야를 포괄하는 163개 오픈 소스 모델에서 훈련 속도가 38%-76% 향상되었습니다.
NVIDIA A100 GPU 비교
또한 팀은 일부 인기 오픈 소스 PyTorch 모델에 대한 벤치마크 테스트를 실시한 결과 30%에서 2배로 상당한 속도 향상을 얻었습니다.
개발자 Sylvain Gugger는 다음과 같이 말했습니다. “단 한 줄의 코드로 PyTorch 2.0은 Transformers 모델 학습 시 1.5배에서 2.0배의 속도 향상을 달성할 수 있습니다. 이는 혼합 정밀도 학습이 등장한 이후 가장 흥미로운 것입니다. technical 개요
graph retuction graph compilations, pytorch 컴파일러를 구축 할 때 그래프 획득은 더 어려운 과제입니다. .
팀은 올해 초 Framework Evaluation API라는 PEP-0523에 도입된 CPython 기능을 사용하여 TorchDynamo 작업을 시작했습니다.
이를 위해 팀은 PyTorch로 작성된 7,000개 이상의 Github 프로젝트를 검증 세트로 사용하여 그래프 캡처에 대한 TorchDynamo의 효율성을 검증하기 위해 데이터 기반 접근 방식을 취했습니다.
TorchInductor
PyTorch 2.0의 새로운 컴파일러 백엔드의 경우 팀은 사용자가 고성능 사용자 정의 커널을 작성하는 방법에서 영감을 얻었습니다. Triton 언어를 점점 더 많이 사용하고 있습니다.
TorchInductor는 Python으로 정의된 루프별 레벨 IR을 사용하여 PyTorch 모델을 GPU에서 생성된 Triton 코드와 CPU에서 C++/OpenMP에 자동으로 매핑합니다.
AOTAutograd
훈련 속도를 높이려면 사용자 수준 코드뿐만 아니라 역전파도 캡처해야 합니다.
AOTAutograd는 PyTorch의 torch_dispatch 확장 메커니즘을 사용하여 Autograd 엔진을 추적하고 역전파를 "미리" 캡처한 다음 TorchInductor를 사용하여 순방향 및 역방향 채널을 가속화할 수 있습니다.
PyTorch에는 1200개 이상의 연산자가 있으며, 각 연산자의 다양한 오버로드를 고려하면 2000개 이상입니다. 따라서 백엔드 또는 도메인 간 기능을 작성하는 것은 에너지를 소비하는 작업이 됩니다.
PrimTorch 프로젝트에서 팀은 더 작고 안정적인 두 개의 연산자 세트를 정의했습니다.
PyTorch 코드에서 일반성을 지원하는 데 필요한 것이 무엇인지 살펴볼 때 핵심 요구 사항은 동적 모양을 지원하고 모델이 매번 모양을 변경하지 않고 다른 크기의 텐서를 수용할 수 있도록 허용하는 것이었습니다. 재컴파일을 유발합니다.
동적 모양이 지원되지 않는 경우 일반적인 해결 방법은 가장 가까운 2의 거듭제곱으로 패딩하는 것입니다. 그러나 아래 차트에서 볼 수 있듯이 상당한 성능 오버헤드가 발생하고 컴파일 시간도 상당히 길어집니다.
이제 동적 모양을 지원하는 PyTorch 2.0은 Eager보다 최대 40% 더 높은 성능을 달성했습니다.
마지막으로 팀은 PyTorch 2.x 로드맵에서 성능과 확장성 측면에서 컴파일 모델을 더욱 발전시키기를 희망합니다.
위 내용은 단 한 줄의 코드로 엘릭서를 두 배 빠르게 만들 수 있습니다! PyTorch 2.0이 깜짝 등장하고 LeCun이 열정적으로 이를 전달합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!