logo
logo
데이터
Pytorch
Python 기반의 오픈소스 머신 러닝 프레임워크이며, 주로 자연어 처리와 같은 애플리케이션을 위해 사용된다.
StackOverflow 질문 수: 24784
Github Stars : ★ 88404
사용 기업
인공지능
패션
금융/보험
교육
이커머스
소셜/컨텐츠
여행
부동산/인테리어
푸드테크
헬스케어
기타
모빌리티
직장
종합
techstack-logo
슈퍼브에이아이
techstack-logo
딜리셔스
techstack-logo
파운트
techstack-logo
뤼이드
techstack-logo
트렌비
techstack-logo
디셈버앤컴퍼니
techstack-logo
당근
techstack-logo
마이리얼트립
techstack-logo
버킷플레이스
techstack-logo
와디즈
techstack-logo
마켓컬리
techstack-logo
왓챠
techstack-logo
마이셀럽스
techstack-logo
버드뷰
techstack-logo
오피지지
techstack-logo
메쉬코리아
techstack-logo
42dot
techstack-logo
카카오엔터테인먼트
더 보기
기술 블로그 글
현대자동차그룹
PyTorch 2.x Torch Compile로 딥러닝 성능 올려보기
안녕하세요. 이홍규 연구원입니다.이번 글은 소소하게 딥러닝 성능을 올려주는 23년 초에 공식 발표된 Pytorch 2.0의 가장 큰 혁신 Torch Compile에 대해서 작성해보고자 합니다. 이미 많은 분들이 애용하시는 기술이지만 '이 기술을 왜 사용해야 하지?'라는 호기심으로 시작해서, 제가 실제 이것을 적용했을 때 어떤 결과가 있었는지 한 번 공유 드리겠습니다.Torch Compile?Pytorch 2.x 공식 문서에 따르면 'PyTorch 2.x: faster, more pythonic and as dynamic as ever'라는 문구가 있습니다. 그리고 바로 torch.compile을 소개하죠. 여기서 알 수 있듯이 Compile된 모델은 이전보다 더욱 Pytorch 코드를 최적화하고 성능을 크게 향상 시키며, 기존 코드와도 100% 호환되도록 한 획기적인 기술입니다.이전 버전의 문제는 명확했습니다. GPU의 발전으로 인한 계산 능력 향상과 메모리 접근 속도의 개선에 비해 기존 파이썬 기반 Eager Execution(즉시 실행)는 한계가 있다는 것입니다. 이러한 한계를 극복하면서, 동적 형태 및 동적 프로그램의 유연성을 유지하기 위해 이 'PyTorch Compiler 프로젝트'가 시작되었고, 그 결과 Pytorch 2.0 버전부터 Torch Compile이 쉽게 사용할 수 있도록 배포되었습니다.기술 개발 배경 [출처: 파이토치 공식 홈페이지]Use & Mechanism'이 정도로 상세하게 적을 필요가 있을까?' 할 정도로 사실 사용법은 너무 쉽습니다. 그저 compile하고자 하는 모델 다음 줄에 아래 한 줄만 추가하면 되는 것이죠compiled_model = torch.compile(model)(공식 사이트 ex) model = models.resnet18().cuda()compiled_model = torch.compile(model)그리고 mode에 따라 자기가 원하는 방향에 맞춰서 결과를 얻을 수도 있습니다.(공식 사이트)# API NOT FINAL# default: optimizes for large models, low compile-time# and no extra memory usagetorch.compile(model)# reduce-overhead: optimizes to reduce the framework overhead# and uses some extra memory. Helps speed up small modelstorch.compile(model, mode="reduce-overhead")# max-autotune: optimizes to produce the fastest model,# but takes a very long time to compiletorch.compile(model, mode="max-autotune")여기서 이 compile이 도대체 무슨 역할을 하길래 좋아진다는 거지?라는 의문에 저는 조금 더 상세하게 조사해보았습니다.왜 torch compile이 Pytorch 2.0의 핵심이고, 많은 사람들에게 사랑 받을 수 있는지 이들의 철학과 Motivation으로 먼저 알 수 있습니다.High-Performance Eager Execution (좋은 성능으로 즉시 실행되도록)Pythonic Internal (직관적인 내부 코드)Good abstractions for Distributed, Autodiff, Data loading, Accelerators, etc. (다양한 분야에서 손쉽게 사용을 위한 추상화)이러한 철학을 바탕으로 torch.compile의 동작 방식을 소개하면 다음과 같습니다. torch.compile의 기반에는 다음과 같은 중요한 기술들이 있습니다 (단순 번역):TorchDynamo : Python Frame Evaluation Hooks를 사용하여 PyTorch 프로그램을 안전하게 캡처합니다. 이는 안전한 그래프 캡처를 위해 5년간의 연구개발(R&D) 결과로 나온 중요한 혁신입니다.AOTAutograd : PyTorch의 autograd 엔진을 오버로드하여, 사전에 계산된(backward) 추적 그래프(autodiff)를 생성합니다.PrimTorch : 약 2000개 이상의 PyTorch 연산자를 약 250개의 기본(primitive) 연산자로 정규화하여, 개발자가 완전한 PyTorch 백엔드를 구축할 때의 장벽을 크게 낮춥니다.TorchInductor : 여러 가속기 및 백엔드를 대상으로 빠른 코드를 생성하는 딥러닝 컴파일러입니다. NVIDIA와 AMD GPU의 경우, 핵심 빌딩 블록으로 OpenAI Triton을 사용합니다.The PyTorch compilation process [출처: 공식 사이트]Example of graph capture [출처: https://www.learnpytorch.io/pytorch_2_intro/] 이를 요약하자면 Pytorch compiler는 동적이고 다양한 Pytorch 코드들을 수정 없이 안정적으로 캡쳐한 뒤 (Graph Acquisition with TorchDynamo), GPU와 CPU에 맞는 최적화된 커널을 자동으로 생성 시켜 최적화 코드로 변환 시키고, autograd 엔진을 통해 순전파와 역전파에 대한 가속화까지 실현합니다.  (Graph Lowering & Compilation with Torch Inductor and AOTAutograd) 마지막으로, 이 모든 과정에서 방대한 연산자들을 낮은 수준으로 축소시켜 개발의 복잡성을  크게 줄여줍니다.  (Stable Primitve Operators with PrimTorch)이러한 기술들의 집약으로 지금의 Torch Compile 기술이 나타났고, 이러한 기술의 결과로 다음과 같은 실질적인 효과들을 얻을 수 있습니다.학습 및 추론 속도 향상 (공식 사이트 상: 학습 속도는 43% 향상)메모리 효율 개선오버헤드의 최소화기술에 대한 추가적인 상세한 정보는 공식 홈페이지에서 상세히 나와있으니 참고 바라고, 이제 실제 제가 실험해봤을 때의 경험을 공유 드리겠습니다.Example저는 오픈
pytorch
현대자동차그룹
업무 효율화를 성공시킨 "임베디드 보드 성능 예측 AI 모델" 개발기
안녕하세요 자율주행 기반기술지원팀 조재훈 책임 연구원입니다. 자율주행 개발을 위해서는 소프트웨어(SW)가 효율적으로 구동이 될 수 있도록 하드웨어 (HW)를 활용하는 것이 중요합니다. 효율적인 HW 활용은 원가절감 측면에서도 많은 이점을 가져다 줍니다. 이를 위해서 딥러닝 네트워크 최적화/경량화 업무들을 진행해 왔습니다.참고: [딥러닝 경량화] 실무에서 적용중인 딥러닝 모델 경량화/최적화 기법은?이번 포스팅은 업무 진행 시, 개발한 SW 알고리즘을 실제로 HW에 탑재할 때 많은 시간이 소모되었던 문제를 해결하기 위해 개발한 임베디드 보드 성능 예측 AI 모델 에 대해 공유드리고자 합니다. 다시 말해서, SW 알고리즘을 HW에 직접 임베딩하는 과정 없이 개발한 딥러닝 모델을 활용해 직접 성능을 예측을 수행할 수 있습니다. 정리해 보면 다음과 같습니다.현업에서 직면한 문제: HW에 임베딩 후 테스트하는 과정에 많은 시간이 소모됨해결책: 임베딩 결과를 예측할 수 있는 AI 모델을 개발하여 많은 시간을 아끼고자 함아래의 그림을 보실까요?Fig 1. 업무 효율화 전/후 비교Fig. 1 As-is와 같은 경우 딥러닝 모델 성능 평가를 할 때 소모되는 시간을 보여줍니다. PyTorch Model을 onnx 파일로 변환시키는 과정부터 Target HW 상에서의 성능을 측정할 때까지 최대 40분 정도의 시간이 소모됩니다. 네트워크를 개발하는 과정에서 많은 개수의 딥러닝 모델에 대해 반복적으로 위의 과정을 수행한다면 네트워크 개수가 많아짐에 따라 시간이 증가합니다. 실제로 업무 수행 시, 다양한 실험들을 수행해야 하기 때문에 시간 측면에서 많은 손실이 있었습니다. Fig. 1 To-be는 저희의 개발 내용인데요, PyTorch Model만 주어지면 별도의 과정을 거치지 않고 손쉽게 원하는 결과에 대해 적은 시간 (최대 50ms)으로 업무 효율화에 도움을 줄 수 있었습니다.제안방법위의 문제를 해결하기 위해 임베디드 보드 성능 예측 AI모델 을 개발하였습니다.Fig.2 임베디드 보드 성능 예측 모델 개요도 제안 방법은 Figure 2.와 같이 4가지 모듈: TVM 컴파일러 [1], 관계 표현자 생성기, 고정 표현자 생성기, 그리고 성능 예측 그래프 모델을 포함합니다. 각 모델 별 선정 이유는 다음과 같습니다.TVM 컴파일러TVM 컴파일러는 다양한 딥러닝 네트워크의 입력 형태를 하나의 일관적인 Intermediate Representation (IR) 으로 변환이 가능합니다. 예를 들어, 입력 딥러닝 네트워크는 PyTorch, Tensorflow, ONNX 등 다양한 종류의 모델 결과물이 목적에 맞게 생성이 되는데, TVM 컴파일러를 활용하면 어떠한 종류 네트워크 결과물을 활용하여도 하나의 통일된 IR 결과를 추출해 낼 수 있기 때문에, 이를 활용하였습니다. 이때 생성된 IR은 네트워크 정보에 대한 고차원의 표현력 (high-level representation)을 담고 있습니다.관계 표현자 생성기관계 표현자 생성기는 IR을 입력으로 활용하여 모델의 모듈들을 그래프 표현자로 생성합니다. 그래프 표현자로 생성하는 이유는, 네트워크안에서 각 모듈 (컨볼루션, 활성화 함수) 간의 관계들에 대해 모델링하는데 이점이 있기 때문입니다.고정 표현자 생성기고정 표현자 생성기는 TVM 컴파일러에서 생성하지 못하는 Conv2D, Conv2D transpose, dense, 그리고 batch matmul (matrix multiplication)과 같은 연산들의 total multiply-accumulate (MACs)의 전체 연산자들 개수를 직접 계산하고 concatenation하여 하나의 고정된 결과물을 생성합니다. 이 정보들은 관계 표현자 생성기의 결과물과 함께 성능 예측 그래프 모델의 입력으로 활용 되어 네트워크 정보에 대한 이해도를 높이는데 활용됩니다.성능 예측 그래프 모델성능 예측 그래프 모델은 GraphSAGE [2]을 기반으로 두 생성기의 결과물들을 입력으로 활용하며, 최종적으로 모델 성능 예측 결과물 (하드웨어 별 latency, Memory, Energy 등)을 출력합니다. GraphSAGE 기반으로 모델을 선정한 이유는, graph 모델의 경우 node 와 edge로 표현자들의 관계성을 정의한 후 해석하는데 용이하기 때문입니다. 기존 graph 모델들은 그래프 구조가 고정되어 있어서 다른 구조를 가진 모델에 대해서는 예측이불가능하지만, GraphSAGE의 경우에는 unseen 데이터에 대해서도 일반적으로 적용될 수 있는 장점이 있습니다. Table 1.에서 자세한 구조를 확인할 수 있습니다.Table 1. 성능 예측 그래프 모델 구조데이터셋 구축학습에 사용 데이터는 총 2200개이며, 2000개의 훈련 세트(train set, 90%), 100개 검증 세트(validation set, 5%) 그리고 100개의 테스트 셋 (test set, 5%)으로 구성하였습니다. 데이터 셋은 컴퓨터 비전에서 범용적으로 사용하는 총 44개의 벤치마크 모델을 torchvision 라이브러리와 저자가 공개한 github code들을 활용하여 모델을 선정하였습니다. 각 모델 별로 50개의 입력 해상도를 조합하여 ONNX 파일 및 .pt 파일을 생성하였습니다. 50개의 입력 해상도는 자율주행 분야에서 일반적으로 많이 사용되는 이미지 해상도를 기준으로 설정하였습니다. Table 3.은 데이터 생성을 위해 활용한 AI 모델 및 입력 해상도에 대한 정보를 보여줍니다. Ground Truth는 2200개의 ONNX 파일을 타겟 하드웨어 (ex) Nvidia, Qualcomm) 에서 지연 시간(Latency)과 처리량(Throughput)을 측정하여 활용하였습니다.Table 2. 데이터 셋 구축을 위한 AI 모델 및 입력 해상도학습 결과Fig3. 추론 방법 snippet모델 추론에 필요한 파라미터는 batch size, model, input size 총 3개입니다. Model의 입력의 경우에는 torchvision, pytorch, onnx 등 다양한 framework에서 개발된 모델을 사용할 수 있습니다. Batch와
pytorch
우아한형제들
로봇 ML 모델의 경량화 #1: 훈련 후 양자화
오늘날 머신러닝(machine learning, ML) 모델 개발은 대부분 NVIDIA의 데이터센터 GPU(예: A100)나 워크스테이션 GPU(예: RTX4090)가 장착된 고성능 서버 환경에서 이루어집니다. 우아한형제들 로보틱스LAB에서도, 실외 배달 로봇의 자율주행에 사용할 ML 모델을 개발할 때 이러한 고성능 서버들을 사용합니다. 덕분에 매우 큰 데이터셋들과 다양한 고성능 ML 모델들을 손쉽게 다루고 있죠. 그러나 여기엔 한 가지 문제점이 있는데, 바로 고성능 서버 환경에서 개발된 ML 모델은 곧바로 로봇에 배포할 수 없다는 점입니다. 이 글에서는 고성능 서버 환경과 실외 자율주행 로봇 환경의 차이점을 살펴보고, 그로부터 ML 모델 경량화의 필요성을 이해한 후, ML 모델 경량화 방법 중 하나인 양자화의 원리와 적용 방법을 알아보겠습니다. 양자화의 원리와 적용 방법에 대해서는 NVIDIA의 공식 문서를 참고하였으며, 이러한 기술들은 로봇을 포함한 다양한 NVIDIA 하드웨어 기반 컴퓨터에 응용할 수 있습니다.로봇이 실외에서 자율주행을 하려면?그림 1. 우아한형제들 로보틱스LAB의 실외 자율주행 배달로봇 ‘딜리’• 충격, 진동, 온도, 습도, 물, 먼지 등을 견디는 내구성• 긴 배터리 수명과 낮은 발열을 위한 전성비• 좁은 로봇 내부 공간에 맞는 작은 크기의 부품들• 다양한 센서를 연결하기 위한 많은 포트 및 높은 호환성이러한 조건을 무시하고 고성능 서버 환경의 GPU를 로봇에 그대로 사용하면, 조금의 충격에도 쉽게 망가지고 배터리도 금방 방전되는 로봇이 될 것입니다. 따라서 실외 환경에서 사용할 로봇에는 이러한 요구 사항들을 충족하는 엣지 디바이스(edge device)를 사용해야 합니다. 일반적으로 ML 목적의 엣지 디바이스에는 행렬 연산에 최적화된 처리 장치를 사용합니다. 그러한 처리 장치로 GPU를 사용할 수도 있고, GPU 대신 포괄적 개념의 ML 모델 처리 장치인 신경망 처리 장치(neural processing unit, NPU), Google의 텐서 처리 장치(tensor processing unit, TPU), Intel의 비전 처리 장치(vision processing unit, VPU), NVIDIA의 딥러닝 가속기(deep learning accelerator, DLA) 등을 사용하기도 합니다. 이러한 처리 장치들은 엣지 디바이스에서 GPU의 역할을 대체합니다. 그렇다면 수많은 ML 목적의 엣지 디바이스 중에서 어떤 제품을 선택해야 할까요? 우아한형제들 로보틱스LAB에서는 NVIDIA의 Jetson 플랫폼을 사용하고 있습니다. 다음 챕터에서는 NVIDIA GPU와 Jetson 플랫폼의 특징을 살펴보고, 그로부터 Jetson 플랫폼의 장점을 알아보겠습니다.NVIDIA GPU는 ML 모델을 처리하는 장치로 많이 쓰입니다. 어떤 ML 처리 장치를 사용하든, 그것으로 ML 모델을 구동시키려면 딥러닝 프레임워크(PyTorch 등)의 포맷으로 되어 있는 ML 모델을 그 처리 장치의 특성에 맞게 최적화된 포맷으로 변환하는
pytorch
왓챠
왓챠 추천 서비스 MLOps 적용기 Part2
안녕하세요. 왓챠 ML팀에서 머신러닝 엔지니어로 일하고 있는 찰스입니다.이전 글에서는 기존 왓챠 ML 파이프라인 및 실험 환경이 가진 문제점에 대해서 살펴보고, 문제를 해결하기 위해 컨테이너 환경의 도입, On-premise GPU 서버와 클라우드 서비스와의 연동, ML 파이프라인과 실험 환경을 제공하기 위해 여러 서비스를 활용한 사례에 대해 살펴보았습니다.이렇게 여러 해결책을 점진적으로 도입한 후 왓챠 ML 파이프라인 및 실험 환경은 기존에 비해 사용성과 안정성에서 많은 개선을 이루었습니다. 다만, 학습된 모델을 서빙하고 모니터링하는 과정은 여전히 개선해야 할 영역으로 남아있었습니다.이 글에서는 왓챠 추천 시스템에서 학습된 추천 모델을 서비스에 반영하기 위해 독립적인 추론 서버가 왜 필요했고 어떻게 개발했는지, 그리고 추론 서버와 추천 모델의 성능을 모니터링하기 위해 어떠한 노력을 기울였는지에 대해서 알아보도록 하겠습니다.기존 왓챠 추천 시스템의 문제점기존 왓챠 추천 시스템은 추천 모델을 학습하고 추천에 필요한 여러 데이터를 정제하는 워커(Worker)와 워커에서 생성한 모델과 정제된 데이터를 이용하여 API 형태로 추천 결과를 제공하는 서비스(Service)로 이루어져 있었습니다.기존 왓챠 추천 시스템이 중 워커는 이전 글에서 설명 드린대로 On-premise GPU 클러스터 내 Argo workflow를 기반으로 작성된 ML 파이프라인으로 이전되었고, ML 파이프라인에서 생성된 여러 모델 및 정제 데이터는 AWS S3와 Redis Pubsub을 통해 서비스로 동기화되어 실시간 반영되고 있었습니다.서비스에서는 업데이트된 학습 모델과 정제 데이터를 활용하되, 하나의 애플리케이션에서 추천 후보 필터링, 전처리, 모델 추론, 후보정과 같은 과정을 거쳐 API 형태로 제공되었으며, 왓챠/왓챠피디아 내 추천 및 랭킹을 필요로 하는 클라이언트로부터 전달받은 여러 요청을 처리하고 있었습니다.이러한 구조의 추천 서비스는 추천 모델과 추천에 필요한 데이터를 애플리케이션 내 메모리에 올려두어 사용하기 때문에 처리 속도가 매우 빠르다는 장점을 가지고 있었지만, Monolithic 서비스 특성상 특정 로직의 수정만으로도 서비스 전체에 배포되어야 하고, 모델의 문제가 추천 서비스 전체 장애로 퍼질 수 있다는 문제점을 가지고 있었습니다.그리고 서비스는 동시성(Concurrency)과 비동기(Asynchronous)를 최대한으로 활용하기에 적합한 Scala로 구현되어 있어 PyTorch로 학습된 추천 모델을 추론하기 위해서는 PyTorch JNI와 같은 Java library가 필요했습니다. 아쉽게도 Pytorch JNI는 Pytorch에서 직접 관리하지 않아 버전 업데이트가 느렸으며 학습과 추론에 효율적인 기능이 PyTorch에 업그레이드되어도 JNI 버전이 업데이트되지 않아 실 서비스에서 빠르게 적용하기가 어려웠습니다. 또한, JNI를 이용하여 모델을 추론했을 때 기본적인 Forward 이외에 지원되는 기능이 제한되어 있어 추론에 필요한 여러 정보를 별도의
kubernetes
pytorch
연관 기술 스택
techstack-logo
Ray
techstack-logo
Tensorflow
Copyright © 2025. Codenary All Rights Reserved.