( 추가 )
Lamda의 이미지로 만드는 것은 용량이 크고 실행시간이 길어 안 될 것이라 판단,
GPU를 사용할 수 있는 ECS + Fargate를 사용해보기로 했습니다. (사용 예정)
후에 구축하게 된다면 구축기로 다시 찾아오겠습니다.
기존에 홈서버에 구축 되어있던 ollama-github-code-review-bot을 구동할 때 ollama가 구동되면서 홈서버(미니PC)가 매우 뜨거워져서 따로 서버가 필요할 것 같다고 생각했다.
Lambda로 동작 가능하다면 거의 무료의 가격으로 만들 수 있을 것 같아 쉽게 보고 도전했으나...
Ollama를 사용했을 때 아래와 같은 부분이 필요하다.
- Ollama가 구동 될 서버가 필요함
- 해당 서버로 POST 요청을 보내서 AI에게 지시
1번 서버, 2번 서버 이렇게 두 개가 필요한 것이다.
하지만 컨테이너 환경으로서 Ollama를 사용할 수 있게 한다면 해당 방법도 한 서버에서 사용할 수 있지 않을까? 라는 생각으로 컨테이너 환경을 구축 해 보았다.
Ollama에 대한 무지한 지식 때문인지, 아니면 Ollama가 동작하는 데 많은 리소스가 필요해서 그런진 모르겠지만... 만드는 데는 실패 했다.
나중에 다시 도전 해봐야겠다. 나중에라도 다시 보고 고칠 수 있지 않을까 싶어 기록용으로 아래에 남겨 둠.
github/workflows는 PR의 git diff를 사용해서 API로 요청을 날리고, 그에 따른 결과를 의견으로 남겨두는 로직이다.
## 파일 구조
.
├── Dockerfile
├── app.py
├── requirements.txt
└── start_ollama.sh
Dockerfile
# AWS Lambda용 Amazon Linux 2 ARM64 베이스 이미지 사용
FROM public.ecr.aws/lambda/python:3.9-arm64
# 작업 디렉토리 설정
WORKDIR /var/task
# 필요한 도구 설치
RUN yum update -y && yum install -y wget tar gzip
# Ollama 설치 (ARM64 버전)
RUN wget https://github.com/jmorganca/ollama/releases/download/v0.1.16/ollama-linux-arm64 -O /usr/local/bin/ollama \
&& chmod +x /usr/local/bin/ollama
# Python 패키지 설치
COPY requirements.txt .
RUN pip3 install -r requirements.txt
# 애플리케이션 파일 복사
COPY app.py .
COPY start_ollama.sh .
# 실행 권한 부여
RUN chmod +x start_ollama.sh
# Lambda 핸들러 설정
CMD ["app.lambda_handler"]
app.py
import json
import subprocess
import requests
import time
import os
def start_ollama_server():
process = subprocess.Popen(["/bin/bash", "/var/task/start_ollama.sh"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print(f"Ollama server start stdout: {stdout}")
print(f"Ollama server start stderr: {stderr}")
# 전역 변수로 서버 시작 여부를 체크
ollama_server_started = False
def wait_for_ollama_server(max_retries=5, delay=5):
for _ in range(max_retries):
try:
response = requests.get('http://localhost:11434/api/health')
if response.status_code == 200:
print("Ollama server is ready")
return True
except requests.exceptions.RequestException:
print(f"Waiting for Ollama server... (retry in {delay} seconds)")
time.sleep(delay)
print("Failed to connect to Ollama server")
return False
def lambda_handler(event, context):
global ollama_server_started
# Ollama 서버가 아직 시작되지 않았다면 시작
if not ollama_server_started:
print("Starting Ollama server...")
start_ollama_server()
ollama_server_started = True
if not wait_for_ollama_server():
return {
'statusCode': 500,
'body': json.dumps({'review': 'Ollama 서버 시작 실패.'})
}
# 이벤트 구조 확인 및 데이터 추출
if 'body' in event:
# API Gateway를 통한 호출
body = json.loads(event['body'])
elif 'Records' in event:
# S3 이벤트 등을 통한 호출
body = event['Records'][0]
else:
# 직접 테스트 호출 등
body = event
# 필요한 데이터 추출 (없으면 기본값 사용)
diff_content = body.get('diff', 'No diff content provided')
pr_number = body.get('pr_number', 'Unknown PR number')
repo = body.get('repo', 'Unknown repository')
print(f"Processing PR #{pr_number} for repo: {repo}")
# Ollama를 사용해 Spring Boot 코드 리뷰 생성
prompt = f"""
Spring Boot 전문가로서 다음 코드 변경사항에 대해 모범 사례, 잠재적 버그, 개선사항을 검토해주세요:
{diff_content}
"""
try:
print("Sending request to Ollama API...")
response = requests.post('http://localhost:11434/api/generate',
json={'model': 'llama2', 'prompt': prompt})
response.raise_for_status()
ai_comment = response.json()['response']
print("Received response from Ollama API")
except Exception as e:
print(f"Ollama API 오류: {str(e)}")
return {
'statusCode': 500,
'body': json.dumps({'review': 'AI 댓글 생성 실패.'})
}
# 리뷰 결과 반환
return {
'statusCode': 200,
'body': json.dumps({'review': ai_comment})
}
requirements.txt
requests
start_ollama.sh
#!/bin/bash
# Ollama 서버를 백그라운드에서 실행
/usr/local/bin/ollama serve &
# 서버가 시작될 때까지 잠시 대기
sleep 10
# Ollama 모델 다운로드 (Lambda 함수 실행 시 수행)
/usr/local/bin/ollama pull llama2
# Lambda 핸들러 실행
exec python3 -m awslambdaric app.lambda_handler
'프로젝트 > 프로젝트 과정' 카테고리의 다른 글
[실패 2회차] Ollama를 이용한 코드 리뷰 봇 만들기 (0) | 2024.09.07 |
---|---|
[Fixture Monkey] 원숭이야, 테스트 값 좀 만들어 줘! (1) | 2024.09.06 |
[잔디일기] 랜덤 값 만들기 (0) | 2024.07.28 |
깃허브 Organigation 레포지토리 복구하기 (2) | 2024.07.23 |
[잔디일기] 에러 핸들링 하기 (0) | 2024.05.24 |