[LLM] Ollama를 이용한 커스텀 LLM(Large Language Models) 만들기
Ollama는 로컬에서 대형 언어 모델(LLM)을 실행할 수 있고, 사용자 친화적인 인터페이스를 제공하기 때문에 많은 프로젝트에서 사용하고 있다. Repo에 등록되어 있는 사전 미세조정(=Fine tuning) 된 LLM을 사용할 수 있지만, 필요에 의해 커스텀해야 하는 경우가 있는데, 이걸 Ollama 에서는 Custom LLM 이라 부른다. Ollama 는 설치되어 있다는 것을 전제로 Custom LLM 을 만들어보자. 이 글에서 사용하고 있는 Ollama 는 0.1.43이다.
mtapp@OneLabsMLA:/home/onelabs$ ollama -v ollama version is 0.1.43
모델 선택
Custom LLM을 제작할 때 사용할 LLM 을 받자. HuggingFace에 등록된 모델을 받는 방법도 있지만, 변환이 필요하니, Ollama 라이브러리 섹션에서 적당한 모델을 받아보자. 내 선택은 Alibaba그룹에서 배포한 qwen2 1.5B 모델이다.

mtapp@OneLabsMLA:/home/onelabs$ ollama pull qwen2:1.5b pulling manifest pulling 405b56374e02... 100% ▕███████████████████████████████████████████████████████████████▏ 934 MB pulling 62fbfd9ed093... 100% ▕███████████████████████████████████████████████████████████████▏ 182 B pulling c156170b718e... 100% ▕███████████████████████████████████████████████████████████████▏ 11 KB pulling f02dd72bb242... 100% ▕███████████████████████████████████████████████████████████████▏ 59 B pulling c9f5e9ffbc5f... 100% ▕███████████████████████████████████████████████████████████████▏ 485 B verifying sha256 digest writing manifest removing any unused layers success mtapp@OneLabsMLA:/home/onelabs$ ollama list NAME ID SIZE MODIFIED qwen2:1.5b f6daf2b25194 934 MB 6 seconds ago
해당 모델이 정상적을 다운로드 되었는지 확인해보자.
mtapp@OneLabsMLA:/home/onelabs$ ollama run qwen2:1.5b >>> 대한민국 수도는 ? 대한민국의 수도는 서울입니다.
API를 이용해 Ollama에 억세스하기
Ollama는 RESTFul API를 제공해 상호 작용 테스트가 가능하다. 기본적으로 11434 포트를 사용하며, API 목록은 다음 URL 에서 확인 가능하다. 테스트 방법은 커맨드라인에서 curl 로 요청 하거나, postman 과 같이 시각화 된 도구를 사용하면 된다.

mtapp@OneLabsMLA:/home/onelabs$ curl <http://192.168.250.230:11434/api/chat> -d '{
"model" : "phi" ,
"messages" : [
{ "role" : "user" , "content" : "대한민국 수도가 어디야?" }
]
}'
....
{
"model": "qwen2:1.5b",
"created_at": "2024-06-27T02:53:18.171191215Z",
"message": {
"role": "assistant",
"content": "대"
},
"done": false
}
....
{
"model": "qwen2:1.5b",
"created_at": "2024-06-27T02:53:18.416634295Z",
"message": {
"role": "assistant",
"content": "."
},
"done": false
}
{
"model": "qwen2:1.5b",
"created_at": "2024-06-27T02:53:18.443603756Z",
"message": {
"role": "assistant",
"content": ""
},
"done_reason": "stop",
"done": true,
"total_duration": 1771502180,
"load_duration": 1325726072,
"prompt_eval_count": 18,
"prompt_eval_duration": 85372000,
"eval_count": 11,
"eval_duration": 272431000
}
모델 커스터마이징
모델 파일에 직접 억세스하면 구조와 매개변수를 확인할 수 있으며 라이선스 정보를 확인할 수 있다.
mtapp@OneLabsMLA:/home/onelabs$ ollama show qwen2:1.5b --modelfile
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this, replace FROM with:
# FROM qwen2:1.5b
FROM /usr/share/ollama/.ollama/models/blobs/sha256-405b56374e02b21122ae1469db646be0617c02928fd78e246723ebbb98dbca3e
TEMPLATE "{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
"
PARAMETER stop <|im_start|>
PARAMETER stop <|im_end|>
LICENSE """
모델 파일을 복사해 나만의 버전을 생성하자.
onelabs@OneLabsMLA:/opt/Ollama$ ollama show qwen2:1.5b --modelfile > new.modelfile
onelabs@OneLabsMLA:/opt/Ollama$ vi new.modelfile
...
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
"
SYSTEM """Focus on information about the United States."""
PARAMETER stop <|im_start|>
PARAMETER stop <|im_end|>
...
onelabs@OneLabsMLA:/opt/Ollama$ ollama create onelabs --file ./new.modelfile
transferring model data
using existing layer sha256:405b56374e02b21122ae1469db646be0617c02928fd78e246723ebbb98dbca3e
using existing layer sha256:62fbfd9ed093d6e5ac83190c86eec5369317919f4b149598d2dbb38900e9faef
creating new layer sha256:722a27628338015bb56fa67da682025b46f748f4750198adf0880006092a8097
using existing layer sha256:c156170b718ec29139d3653d40ed1986fd92fb7e0959b5c71f3c48f62e6636f4
using existing layer sha256:f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
creating new layer sha256:0723a690de8c40e0962b3d70bb0069200c1355de894adfbbebf9299cf559357e
writing manifest
success
Ollama 모델 목록에 조금 전 생성한 모델명 (onelabs)가 보인다.
onelabs@OneLabsMLA:/opt/Ollama$ ollama list NAME ID SIZE MODIFIED onelabs:latest df2b987f75d8 934 MB 19 seconds ago qwen2:1.5b f6daf2b25194 934 MB 24 minutes ago onelabs@OneLabsMLA:/opt/Ollama$ ollama run onelabs >>> 너는 누구? 저는 인공지능으로, 특정 개인과 직접적인 관련이 없습니다. 당신의 질문에 응답하는 데 도움을 드리려고 노력합니다.
기본적인 커스텀 LLM 이 생성된 것을 확인할 수 있다. 이제 미세조정을 시도해보자.

