[AI] 모델 추론 성능 최적화 - 100-hours-a-week/21-iceT-wiki GitHub Wiki

최적화 기법 적용

Colab code

1. max_tokens 동적 설정

  • 기존: 모든 요청에 max_tokens=1000 고정

  • 변경: 프롬프트 길이에 따라 max_tokens = max(len(prompt.split()) * 1.5, 300)

  • 목적: 과도한 디코딩 방지, 응답 시간 단축, 메모리 절감

2. 프롬프트 채팅 템플릿 캐싱

  • 기존: tokenizer.apply_chat_template()를 매 요청마다 호출

  • 변경: @lru_cache를 이용해 동일 메시지 시퀀스에 대한 처리 결과 재사용

  • 목적: 토크나이즈 처리 반복 방지, 응답 속도 향상

3. SamplingParams 내 stop_token_ids 명시

  • 기존: 생략되거나 설정 불명확

  • 변경: stop_token_ids=[tokenizer.eos_token_id] 명시

  • 목적: 응답이 적절한 시점에서 종료되도록 하여 불필요한 디코딩 방지

4. 면접 총평 응답 길이 보장

  • 기존: 총평 응답도 max_tokens=1000 고정

  • 변경: base_tokens=512 이상으로 보장 (스트리밍 또는 일반 모드 공통)

  • 목적: 긴 응답이 끊기지 않도록 최소 길이 확보

5. 캐시 키 구성 방식 개선

  • 기존: 캐싱 X

  • 변경: repr(messages)를 캐시 키로 사용해 단순하고 충돌 없는 구조 구현

  • 목적: 동일 요청에 대한 프롬프트 결과 재활용을 가능하게 함

항목 최적화 적용 전 최적화 적용 후 변경 이유 (Why)
max_tokens 설정 고정값 1000 입력 길이에 따라 동적으로 설정 짧은 프롬프트에도 불필요한 디코딩 발생 → 리소스 낭비 방지
chat_template 처리 매 요청마다 apply_chat_template() 호출 @lru_cache로 프롬프트 캐싱 동일 입력에 대해 중복 연산 제거 → latency 감소
프롬프트 생성 (make_initial_prompt) 함수 호출만 반복 (선택적으로) 문제 번호 + 코드 기반 캐싱 가능 반복 출제 문제 대응 속도 향상
Sampling 설정 고정 temperature=0.3, top_p=0.9, max_tokens=1000 유지하되 입력에 따라 조정 가능 상황에 따라 생성 품질/속도 균형 맞추기 위함
대화 길이 증가 시 처리 전략 고려 없음 (context 계속 쌓임) context 길이에 따라 max_tokens 감소 or 요약 적용 고려 가능 긴 대화 시 context trimming으로 latency 제어 가능
응답 시간 체감 요청마다 3~5초 이상 (긴 입력시 더 증가) 평균 1~2초 이내로 응답 가능 캐싱 + 디코딩 제한으로 추론 지연 줄어듦
GPU 메모리 사용량 예측 불가능 (프롬프트 길이에 따라 편차 큼) max_tokens 축소로 메모리 최대 30% 절감 더 많은 동시 사용자 처리 가능성 확보

추후 진행해야 할 사항

  1. FastAPI 비동기 처리
  2. 스트리밍 실제 적용 확인
  3. AI 대답 성능 향상 작업 (프롬포트 수정)