Optimum-Intel 및 OpenVINO GenAI를 사용한 Hugging Face 모델 최적화 및 배포

Hugging Face와 Intel은 Optimum-Intel 및 OpenVINO GenAI를 사용하여 Intel 하드웨어에서 Transformers 모델을 최적화하고 배포하는 워크플로를 도입했습니다. 이 접근 방식은 개발자가 Python 기반 학습 환경에서 모델을 엣지에서 최소한의 종속성으로 고성능 C++ 또는 Python 추론으로 이동할 수 있게 합니다.

OpenVINO를 통한 효율적인 엣지 배포

OpenVINO는 C++ AI 추론 솔루션으로 설계되어 소프트웨어 종속성을 최소화하는 것이 중요한 엣지 및 클라이언트 측 배포에 특히 적합합니다. GenAI API의 도입으로 대형 언어 모델(LLM)을 애플리케이션에 통합하는 것이 더욱 간단해져 성능이 향상되고 Python이 최적이 아닐 수 있는 환경에서 배포 복잡성이 감소합니다.

Transformers 모델을 OpenVINO IR로 내보내기

Optimum-Intel 프로젝트를 통해 Hugging Face Transformers 모델을 OpenVINO 중간 표현(IR) 형식으로 내보낼 수 있습니다. 이 과정은 🤗 Transformers API를 그대로 반영하는 래퍼(예: OVModelForCausalLM)를 활용합니다.

개발자는 두 가지 주요 방법으로 모델을 내보낼 수 있습니다:

  • Python API: export=True와 함께 .from_pretrained() 메서드를 사용합니다.
  • Command Line Interface (CLI): optimum-cli export openvino 명령을 사용합니다.

모델을 내보내면 .xml.bin IR 모델 파일, 구성 파일, 그리고 openvino-tokenizers 라이브러용으로 변환된 토크나이저가 포함된 디렉터리가 생성됩니다.

모델 최적화 및 양자화

리소스가 제한된 장치에서 지연 시간과 메모리 사용량을 줄이기 위해 가중치 전용 양자화를 권장합니다. Optimum-Intel은 Neural Network Compression Framework(NNCF)를 활용하여 다양한 최적화 기법을 제공합니다:

  • 기본 양자화: 10억 개 이상의 파라미터를 가진 모델은 내보내기 시 기본적으로 INT8로 양자화됩니다.
  • 고급 양자화: 4비트 정수 가중치 전용 양자화는 정확도와 성능 사이의 균형을 개선합니다. Llama-3.1-8B와 같은 모델에 권장되는 기법으로는 AWQ(Activation-aware Weight Quantization) 스태킹, 양자화 스케일 추정, 그리고 보정 데이터셋을 활용한 혼합 정밀도 INT4/INT8 양자화가 있습니다.

양자화가 정확도에 미치는 영향

양자화는 일반적으로 정확도에 약간의 저하를 가져옵니다. Wikitext 데이터셋에서 Word Perplexity(PPL) 지표를 사용한 결과, meta-llama/Meta-Llama-3.1-8B에 대한 영향은 다음과 같습니다:

모델 PPL PyTorch FP32 OpenVINO INT8 OpenVINO INT4
Meta-Llama-3.1-8B 7.3366 7.3463 7.8288

OpenVINO GenAI API를 활용한 배포

모델이 변환 및 최적화되면 OpenVINO GenAI의 LLMPipeline 클래스가 Python과 C++ 모두에서 최소한의 종속성으로 배포를 가능하게 합니다.

Python 배포

Python에서 배포하려면 openvino-genai 패키지만 필요합니다. LLMPipelineGenerationConfig 객체를 통해 모델 로드와 텍스트 생성을 처리하며, max_new_tokens와 같은 매개변수를 제어합니다.

C++ 배포

C++ API는 🤗 Transformers API에서 원활하게 마이그레이션하도록 설계되었습니다. 개발자는 하드웨어 디바이스(예: "CPU" 또는 "GPU")를 지정하고 ov::genai::LLMPipeline을 사용하여 생성할 수 있습니다.

고급 생성 기능

LLMPipeline은 사용자 경험과 성능을 향상시키는 여러 고수준 기능을 지원합니다:

  • 맞춤 디코딩: Beam Search와 같은 알고리즘을 지원합니다.
  • 대화형 채팅: start_chat()finish_chat() 메서드를 통해 대화형 시나리오를 구현할 수 있습니다. 이 메서드들은 이전 채팅 기록의 KV 캐시를 활용해 프롬프트 처리 시간을 줄입니다.
  • 스트리밍: 전체 시퀀스를 기다리는 대신 토큰이 생성될 때마다 출력하는 스트리머 함수를 구현할 수 있습니다.

기술 요구 사항

구현을 위해 다음 패키지 버전이 지정됩니다:

  • transformers: 4.44
  • openvino: 24.3
  • openvino-tokenizers: 24.3
  • optimum-intel: 1.20
  • lm-eval: 0.4.3
  • openvino-genai: 24.3

Sources