데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      vLLM로 효율적인 모델 서빙하기

      SSunny 25.02.12
      10,433 8 1
      DEVOTEE 요약
      모델 서빙을 개선하기 위한 방법으로 배치 전략, 트랜스포머 연산, 추론 전략을 검토합니다. 배치 전략에서는 정적, 동적, 연속 배치가 있으며 특히 연속 배치는 GPU 자원을 효율적으로 활용하여 지연 시간을 줄이는 데 적합합니다. 또한, 트랜스포머 연산에서는 플래시 어텐션과 같은 기술로 메모리 사용량을 줄이고 성능을 향상시킬 수 있으며, 커널퓨전과 같은 추론 전략을 통해 연산 오버헤드를 줄일 수 있습니다.

      sLLM 서빙하기

      동일한 연산을 수행하면서 성능 하락이 없으면서도 추론 능력을 향상시키는 방안을 통해 모델 서빙을 수행합니다.

      배치 전략과 트랜스포머 연산, 추론 전략으로 나눠서 살펴봅니다.

      배치전략 (batching)

      LLM 서빙에서 배치 전략은 모델의 처리량과 지연 시간을 최적화하는 데 중요한 역할을 합니다.

      • 정적배치: 일반 배치로 고정된 크기의 배치가 채워질 때마다 처리하는 방식입니다.

        입력 데이터를 배치할 때 한번에 N개 입력을 받아 모두 추론이 끝날때까지 기다리는 방식입니다.

        지연 시간이 크게 증가할 수 있어 실시간 서비스에는 적합하지 않습니다.

      • 동적배치: 동적 배치는 일정 시간 동안 들어온 요청들을 모아서 한 번에 처리하는 방식입니다.

        GPU 자원을 효율적으로 활용하여 처리량을 높일 수 있지만 배치 간격만큼 지연 시간이 발생합니다.

      • 연속배치 : LLM에 가장 적합한 방식으로 연속 배치는 토큰 단위로 요청을 처리하며, 배치 크기를 동적으로 조절합니다.

        GPU 자원을 효율적으로 활용하는 방법으로 요청이 완료되는 즉시 결과를 반환할 수 있어 지연 시간을 줄일 수 있습니다.

        vLLM 등의 라이브러리가 사용됩니다.

      트랜스포머 연산

      동일한 계산을 수행하더라도 메모리 사용량을 줄이고 속도를 높이는 트랜스포머 연산 기술을 이용하여 서빙 최적화를 수행합니다.

      • 플래시 어텐션 (Flash Attention): 플래시 어텐션은 트랜스포머의 Self Attention 연산 시 발생하는 메모리 처리량 병목 현상을 해결하는 GPU 최적화 기법입니다.

        어텐션 연산 과정을 변경해 학습 과정에서 필요한 메모리를 시퀀스 길이에 비례하도록 개선하여 HBM과 SRAM 사이의 I/O를 최소화하여 기존 방식보다 약 2배 이상 지연 시간을 줄일 수 있습니다.

        역전파 과정에서 다시 순전파를 계산하는 방식으로 연산을 중복해서 실행하더라도 메모리 접근을 최소화하여 성능을 향상시킵니다.

      • 플래시 어텐션2 : 플래시 어텐션에 2배 속도를 향상시킨 방식입니다.

        알고리즘을 개선하여 softmax 등의 불필요한 연산을 제거하고 행렬곱 위주의 연산을 수행합니다. 시퀀스 길이 방향의 병렬화를 추가하였습니다.

      • 상대적 위치 인코딩: 토큰의 절대적인 위치에 따라 임베딩을 더하는 방식이 아닌 토큰과 토큰 사이의 상대적인 위치 정보를 추가하는 방식입니다. RoPE, ALiBi 등이 있습니다.

      추론 전략

      • 커널퓨전: 반복적인 여러 개의 연산을 하나의 GPU 커널로 결합하여 오버헤드를 줄이는 최적화 기법입니다. 플래시 어텐션이 이 방법을 사용합니다.

      • 페이지드 어텐션: OS의 가상 메모리 관리 기법을 LLM의 어텐션 메커니즘에 적용한 기술입니다.

        KV(Key-Value) 캐시를 페이지 단위로 관리하여 GPU 메모리 사용을 최적화합니다.

        GPU 메모리에서 KV캐시를 토큰 순서에 따라 바로 옆에 저장할 수 있도록 미리 예약합니다.

      • 추론디코딩: 쉬운 단어는 더 작고 효율적인 모델이 예측하고 어려운 단어는 더 크고 성능이 좋은 모델이 예측하는 2개 모델을 사용하는 방식입니다.

        작은 드래프트 모델과 큰 타깃 모델을 이용해서 추론을 수행합니다.

        2개 모델을 사용하여 시스템 복잡도가 올라가는 단점을 해결하기 위해 하나의 원본 모델 내에서 여러 토큰을 예측하는 메두사 방식이 있습니다.

      LLM 서빙

      LLM 서빙 시스템을 설계할 때는 애플리케이션의 요구사항과 사용 패턴을 고려하여 온라인 서빙과 오프라인 서빙을 적절히 조합하는 것이 중요합니다.

      때로는 두 방식을 혼합하여 사용하기도 합니다.

      • 온라인 서빙(API서버): 온라인 서빙은 실시간 또는 거의 실시간으로 사용자의 요청에 응답하는 방식입니다.

        FastAPI나 Flask 같은 웹 프레임워크를 사용하여 REST API 서버를 구축하여 API를 통해 요청이 들어오면 즉시 결과를 반환하는 구조로 대화형 챗봇, 실시간 번역, 즉각적인 텍스트 생성 등에 사용에 사용됩니다.

        서버 부하, 예측 성능, 에러 등을 실시간으로 모니터링합니다.

      • 오프라인서빙(배치 서빙): 오프라인 서빙은 대량의 데이터를 일괄적으로 처리하는 방식입니다.

        Airflow나 Argo Workflow 같은 스케줄링 도구를 사용하여 특정 주기나 이벤트에 따라 대규모 데이터를 일괄적으로 처리하고 결과를 저장소(예: 데이터베이스, S3 버킷)에 저장하여 처리합니다.

        대용량 데이터 처리를 위해 분산 컴퓨팅 환경을 활용할 수 있습니다.


      vLLM 사용해보기

      vLLM은 Paged Attention 기법을 활용하여 지연 시간을 유지하면서 처리량을 2-4배 향상시킨 라이브러리입니다.

      다양한 최신 모델을 지원하며, 효율적인 LLM 서빙을 가능하게 합니다.

      vLLM을 설치하고 아래 예시를 수행해 보겠습니다. 온라인 서빙을 위해 flask도 함께 설치합니다.

      아래 예시 코드는 Perflexity의 도움을 받아 만들었습니다.

      예상결과와 실제 결과가 많은 차이가 있습니다.

      pip install vllm
      pip install flask

      vLLM의 오프라인추론

      아래 코드는 여러 프롬프트에 대해 한 번에 텍스트를 생성하고 결과를 출력합니다

      from vllm import LLM, SamplingParams
      
      # 프롬프트 목록 정의
      prompts = [
          "Mexico is famous for ",
          "The largest country in the world is "
      ]
      
      # 샘플링 파라미터 설정
      sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
      
      # LLM 초기화
      llm = LLM(model="facebook/opt-125m")
      
      # 텍스트 생성
      responses = llm.generate(prompts, sampling_params)
      
      # 결과 출력
      for response in responses:
          print(response.outputs[0].text)
      • vLLM 라이브러리에서 필요한 클래스를 임포트합니다. LLM은 언어 모델을 로드하고 사용하기 위한 클래스이고, SamplingParams는 텍스트 생성 시 사용할 파라미터를 설정하는 클래스입니다.

      • 첫 번째 프롬프트 "Mexico is famous for "에 대한 응답과 두 번째 프롬프트 "The largest country in the world is "에 대한 응답으로 프롬프트를 작성합니다.

      • 텍스트 생성 시 사용할 파라미터를 설정합니다. temperature는 생성된 텍스트의 다양성을 조절하며, top_p는 누적 확률 기반으로 토큰을 선택하는 방식을 제어합니다.

      • 사용할 언어 모델을 초기화합니다. 이 예시에서는 Facebook의 OPT-125M 모델을 사용합니다.

      • generate 메소드를 사용하여 프롬프트 목록에 대한 텍스트를 생성합니다. 이 메소드는 프롬프트 목록과 샘플링 파라미터를 인자로 받습니다.

      • 생성된 각 응답에 대해 반복하며 텍스트를 출력합니다. response.outputs.text는 생성된 텍스트를 나타냅니다.

      예시 결과

      its vibrant culture, delicious cuisine, and ancient Mayan ruins. The country is known for its colorful festivals, such as the Day of the Dead, and its iconic dishes like tacos, guacamole, and mole. Mexico is also famous for its beautiful beaches, including popular destinations like Cancun and Tulum. Additionally, the country is renowned for its rich history, including the Aztec and Maya civilizations, as well as its diverse landscapes, from deserts to rainforests.
      
      Russia. With a total area of approximately 17,098,246 square kilometers (6,601,670 square miles), Russia is the largest country in the world by land mass. It spans two continents, Europe and Asia, and covers more than one-eighth of the Earth's inhabited land area. Russia's vast territory includes diverse landscapes, from tundra and forests to mountains and steppes. It borders 14 countries and has coastlines on the Arctic, Pacific, and Atlantic Oceans.

      실제 결과

      역시 실제는 예상과 다르게 동작이 잘 되지 않네요. 코랩에서 T4로 돌려서 환경이 달라서일 수도 있겠습니다.

      Processed prompts: 100%|██████████| 2/2 [00:00<00:00, 21.11it/s] chaser cars
      The Mexican government has been doing a good job of making them
      ~~very bad~~ very rich.
      Not so bad in the UK. The

      vLLM 온라인추론

      온라인 서빙은 실시간으로 사용자의 요청에 응답하는 방식으로, API 서버를 통해 구현됩니다.

      온라인 추론을 위해서는 아래와 같이 서버가 필요합니다.

      예시로 google/gemma-2b 모델을 사용하여 vLLM 서버를 시작합니다.

      python -m vllm.entrypoints.openai.api_server --model=google/gemma-2b

      아래 코드는 Flask를 사용하여 간단한 API 서버를 구현합니다. 

      /generate 엔드포인트로 POST 요청을 보내면 프롬프트에 대한 생성된 텍스트를 JSON 형식으로 반환합니다

      from flask import Flask, request, jsonify
      from vllm import LLM, SamplingParams
      
      app = Flask(__name__)
      
      # LLM 및 샘플링 파라미터 초기화
      sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
      llm = LLM(model="facebook/opt-125m")
      
      @app.route('/generate', methods=['POST'])
      def generate():
          data = request.get_json()
          prompts = data.get('prompts', [])
          outputs = llm.generate(prompts, sampling_params)
          
          results = []
          for output in outputs:
              results.append({
                  'prompt': output.prompt,
                  'generated_text': output.outputs[0].text
              })
          
          return jsonify(results)
      
      if __name__ == '__main__':
          app.run(host='0.0.0.0', port=5000)

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      SSunny 님의 최신 블로그

      더보기
      동영상 기고하기