일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CVAT
- Trino
- OS
- Vision
- Kafka
- airflow
- ip
- kubeadm
- grafana
- Operating System
- MAC address
- helm
- java
- AWS
- tcp
- Spring
- Packet
- kubectl
- docker
- log
- Python
- PostgreSQL
- jvm
- CSV
- EC2
- kubernetes
- aws s3
- JavaScript
- zookeeper
- Network
- Today
- Total
JUST WRITE
[LLM] RAG와 LLM을 활용한 자동 분류(2) - Ollama 세팅하기 본문
Ollama 세팅하기
데이터를 카테고리별로 자동 분류하는 과제를 진행하고 있습니다.
LLM과 RAG를 활용해서 자동 분류를 진행하려고 합니다.
방식을 간단하게 나열해 보면 아래와 같습니다.
- 학습에 쓰일 과거 데이터를 VectorDB에 저장한다.
- 서버에 OpenSource 기반의 LLM을 설치한다.
- 분류를 진행하려는 데이터를 VectorDB에서 유사한 데이터를 찾는다.
- 찾은 데이터를 기반으로 프롬프트를 구성해서 LLM에 어떤 카테고리에 해당하는지 물어본다.
이전 포스팅에서 VectorDB 설치에 관해 정리하였습니다.
이번 포스팅은 2번째 포스팅으로 오픈소스 기반의 LLM 설치를 정리하겠습니다.
LLM 모델 선택
LLM(Large Language Model) 개발에 대규모 자본과 투자가 필요합니다.
이를 감당할 수 있는 것은 빅테크 기업뿐입니다.
LLM이 빠르게 독점화, 권력화 되어가고 있었습니다.
마이크로소프트가 GPT-3 독점 라이선스를 획득한 경우도 있었습니다.
하지만 이에 맞서 허깅페이스 중심으로 많은 오픈소스 LLM이 나오고 있습니다.
LLM | 설명 |
Falcon | UAE의 TII가 개발했으며 적은 파라미터로도 뛰어난 성능을 보여주는 리소스 효율적인 모델 |
BLOOM | 프랑스 주도로 개발된 다국어 지원에 특화된 모델로, 46개 자연어와 13개 프로그래밍 언어 지원 |
MPT | MosaicML이 개발한 모델로 긴 컨텍스트 처리에 강점이 있으며 32k 토큰 길이 지원 |
Mistral | 프랑스 Mistral AI가 개발한 7B 크기의 컴팩트한 모델로 효율성과 성능의 균형이 뛰어남 |
빅테크 기업 중 하나인 Meta에서도 llama라는 LLM을 오픈소스로 공개하였습니다.
현재 llama 3.3까지(24/12/14 기준) 공개하였습니다.
다른 모델들에 비해 더 적은 파라미터로 높은 성능을 달성하여 효율적인 LLM으로도 유명합니다.
업데이트도 빠르고 라이선스 조건도 관대해서 다양한 파생모델이 존재합니다.
이번 과제에서는 우선적으로 llama 파생 모델을 사용하려고 합니다.
서울과기대 MLP연구실에서 한국어-영어 시각-언어모델 Bllossom-Vision을 공개하였습니다.
해당 모델은 llama 3.1 모델을 기반으로 만들어졌다고 합니다.
한국어 기반의 내용을 토대로 카테고리를 분류를 할 예정이라 해당 모델을 최우선적으로 선택하였습니다.
Ollama 설치
LLM을 쉽게 사용할 수 있도록 Ollama를 설치합니다.
Ollama는 로컬 환경에서 AI 모델을 쉽게 실행할 수 있게 해주는 오픈소스 플랫폼입니다.
간단하게 로컬 환경에서 LLM을 실행할 수 있고 CLI도 비교적 쉽습니다.
다양한 오픈소스 LLM을 지원하며 REST API 형태로 LLM를 사용할 수 있게 해 줍니다.
이번 포스팅에서는 docker compose를 활용하여 Ollama를 설치합니다.
그리고 open-webui를 연결해서 WEB UI 형태로도 접근할 수 있게 세팅합니다.
services:
ollama:
volumes:
- ./volumes/ollama:/root/.ollama
- /usr/bin/nvidia-smi:/usr/bin/nvidia-smi
- /usr/lib/x86_64-linux-gnu/libnvidia-ml.so:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so
- /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
container_name: ollama
pull_policy: always
tty: true
restart: unless-stopped
image: ollama/ollama:0.4.7
ports:
- 7869:11434
environment:
- OLLAMA_KEEP_ALIVE=24h
networks:
- ollama-docker
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
ollama-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ollama-webui
volumes:
- ./volumes/ollama-webui:/app/backend/data
depends_on:
- ollama
ports:
- 8080:8080
environment: # https://docs.openwebui.com/getting-started/env-configuration#default_models
- OLLAMA_BASE_URLS=http://host.docker.internal:7869 #comma separated ollama hosts
- ENV=dev
- WEBUI_AUTH=False
- WEBUI_NAME=valiantlynx AI
- WEBUI_URL=http://localhost:8080
- WEBUI_SECRET_KEY=t0p-s3cr3t
extra_hosts:
- host.docker.internal:host-gateway
restart: unless-stopped
networks:
- ollama-docker
networks:
ollama-docker:
external: false
docker compose up 명령어로 실행하면 2개의 컨테이너가 실행된 것을 확인할 수 있습니다.
그리고 open-webui 포트로 WEB-UI를 확인할 수 있습니다.
$ docker ps
fd4bffde5661 ghcr.io/open-webui/open-webui:main "bash start.sh" 9 days ago Up 9 days (healthy) 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp ollama-webui
310eb3c663a5 ollama/ollama:0.4.7 "/bin/ollama serve" 9 days ago Up 9 days 0.0.0.0:7869->11434/tcp, [::]:7869->11434/tcp
ChatGPT와 비슷한 화면을 제공하기 때문에 사용하기 편리합니다.
로컬에 다양한 모델을 다운받고 원하는 대로 모델을 선택해서 사용할 수 있습니다.
허깅페이스 모델 Ollama에서 사용하기
Ollama에서 제공하는 모델을 사용하기 위해서는 CLI로 간단하게 다운로드 할 수 있습니다.
$ ollama pull llama3.1:8b
# 다운로드한 모델 리스트 확인
$ ollama list
NAME ID SIZE MODIFIED
nomic-embed-text:latest 0a109f422b47 274 MB 9 days ago
mistral:7b f974a74358d6 4.1 GB 9 days ago
llama3.1:8b 46e0c10c039e 4.9 GB 9 days ago
# 실행중인 모델 확인
$ ollama ps
NAME ID SIZE PROCESSOR UNTIL
llama3.1:8b 46e0c10c039e 6.9 GB 100% GPU 24 hours from now
Ollama CLI를 통해서 쉽게 사용할 수 있지만 Ollama에서 모든 모델을 제공하지 않습니다.
이번에 사용하려고 하는 Bllossom-Vision 모델도 허깅페이스에 업로드되어 있습니다.
다른 프레임워크인 vLLM에서도 사용가능하지만 이번 포스팅에서 Ollama에서 사용할 수 있도록 세팅하겠습니다.
llama.app을 통해 모델 변환
Ollama의 Modelfile을 사용해서 바꾸는 방법도 있지만
llama.app을 통해서 Ollama에서 사용할 수 있도록 변환해 보겠습니다.
먼저 위 Github에서 소스를 다운로드합니다.
소스에 있는 requirements.txt 파일 기준으로 필요한 파이썬 패키지를 설치합니다.
추가적으로 허깅페이스에서 모델을 다운로드하기 위해 huggingface_hub 패키도 설치합니다.
$ git clone https://github.com/ggerganov/llama.cpp.git
Cloning into 'llama.cpp'...
remote: Enumerating objects: 39659, done.
remote: Counting objects: 100% (9656/9656), done.
remote: Compressing objects: 100% (559/559), done.
remote: Total 39659 (delta 9404), reused 9109 (delta 9097), pack-reused 30003 (from 1)
Receiving objects: 100% (39659/39659), 62.67 MiB | 18.65 MiB/s, done.
Resolving deltas: 100% (28930/28930), done.
$ cd llama.cpp
$ pip install -r requirements.txt
$ pip install huggingface_hub
아래 파이썬 코드를 통해서 원하는 Bllossom-Vision 모델을 다운로드하겠습니다.
$ mkdir bllossom
$ vi download.py
from huggingface_hub import snapshot_download
model_id="Bllossom/llama-3.1-Korean-Bllossom-Vision-8B"
snapshot_download(repo_id=model_id, local_dir="bllossom", local_dir_use_symlinks=False, revision="main")
$ python download.py
.gitattributes: 100%|████████████████████████████████████████████████████████████████████| 1.52k/1.52k [00:00<00:00, 4.78MB/s]
generation_config.json: 100%|████████████████████████████████████████████████████████████████| 143/143 [00:00<00:00, 2.21MB/s]
README.md: 100%|██████████████████████████████████████████████████████████████████████████| 9.53k/9.53k [00:00<00:00, 124MB/s]
config.json: 100%|███████████████████████████████████████████████████████████████████████| 1.35k/1.35k [00:00<00:00, 23.0MB/s]
model.safetensors.index.json: 100%|██████████████████████████████████████████████████████| 70.2k/70.2k [00:00<00:00, 3.18MB/s]
preprocessor_config.json: 100%|██████████████████████████████████████████████████████████████| 702/702 [00:00<00:00, 12.7MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████| 444/444 [00:00<00:00, 8.62MB/s]
tokenizer_config.json: 100%|█████████████████████████████████████████████████████████████| 51.7k/51.7k [00:00<00:00, 17.5MB/s]
tokenizer.json: 100%|████████████████████████████████████████████████████████████████████| 9.09M/9.09M [00:01<00:00, 7.17MB/s]
model-00004-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 1.84G/1.84G [00:45<00:00, 40.4MB/s]
model-00001-of-00004.safetensors: 4%|██ | 199M/4.95G [00:44<26:27, 2.99MB/s]
model-00001-of-00004.safetensors: 11%|█████▊ | 566M/4.95G [01:03<05:03, 14.4MB/s]
model-00002-of-00004.safetensors: 47%|███████████████████████▌ | 2.32G/4.92G [01:04<01:03, 41.1MB/s]
model-00003-of-00004.safetensors: 18%|████████▉ | 881M/5.00G [00:44<07:26, 9.22MB/s]
model-00003-of-00004.safetensors: 31%|███████████████▌ | 1.55G/5.00G [01:04<01:16, 44.8MB/s]
다운로드가 완료되고 해당 폴더를 확인해 보면 16GB가 정도 되는 파일들이 존재합니다.
그중에서도 safetensors 파일 용량을 확인해 보면 눈에 띄게 큰 것을 알 수 있습니다.
모델이 safetensors 파일 형태로 저장되어 있습니다.
$ bllossom & ls -alh
drwxrwxr-x 3 manager manager 4.0K Dec 14 04:15 .cache
-rw-rw-r-- 1 manager manager 1.4K Dec 14 04:15 config.json
-rw-rw-r-- 1 manager manager 143 Dec 14 04:15 generation_config.json
-rw-rw-r-- 1 manager manager 1.5K Dec 14 04:15 .gitattributes
-rw-rw-r-- 1 manager manager 4.7G Dec 14 04:18 model-00001-of-00004.safetensors
-rw-rw-r-- 1 manager manager 4.6G Dec 14 04:17 model-00002-of-00004.safetensors
-rw-rw-r-- 1 manager manager 4.7G Dec 14 04:18 model-00003-of-00004.safetensors
-rw-rw-r-- 1 manager manager 1.8G Dec 14 04:16 model-00004-of-00004.safetensors
-rw-rw-r-- 1 manager manager 69K Dec 14 04:15 model.safetensors.index.json
-rw-rw-r-- 1 manager manager 702 Dec 14 04:15 preprocessor_config.json
-rw-rw-r-- 1 manager manager 9.4K Dec 14 04:15 README.md
-rw-rw-r-- 1 manager manager 444 Dec 14 04:15 special_tokens_map.json
-rw-rw-r-- 1 manager manager 51K Dec 14 04:15 tokenizer_config.json
-rw-rw-r-- 1 manager manager 8.7M Dec 14 04:15 tokenizer.json
$ du -h -d 1 .
68K ./.cache
16G .
safetensors 파일을 gguf 파일 형태로 변환해줘야 합니다.
llama.app에서 제공하는 파일 convert_hf_to_gguf.py을 통해 변환해 줍니다.
아래와 같은 에러가 발생하였습니다.
llconvert_hf_to_gguf.py는 현재 멀티모달 모델(이미지와 텍스트를 함께 처리하는 모델)을 지원하지 않는 것을 알았습니다.
$ python convert_hf_to_gguf.py ./bllossom \
--outfile llama-3.1-Korean-Bllossom-Vision-8B.gguf
INFO:hf-to-gguf:Loading model: bllossom
ERROR:hf-to-gguf:Model LlavaNextForConditionalGeneration is not supported
대신 한국 기업 올거나이즈에서 llama3 기반으로 만든 모델을 변환해보겠습니다.
$ python download.py
/home/manager/.pyenv/versions/transfer-llm/lib/python3.10/site-packages/huggingface_hub/file_download.py:834: UserWarning: `local_dir_use_symlinks` parameter is deprecated and will be ignored. The process to download files to a local folder has been updated and do not rely on symlinks anymore. You only need to pass a destination folder as`local_dir`.
For more details, check out https://huggingface.co/docs/huggingface_hub/main/en/guides/download#download-files-to-local-folder.
warnings.warn(
README.md: 100%|█████████████████████████████████████████████████████████████████████████| 5.82k/5.82k [00:00<00:00, 15.3MB/s]
.gitattributes: 100%|████████████████████████████████████████████████████████████████████| 1.52k/1.52k [00:00<00:00, 5.11MB/s]
config.json: 100%|███████████████████████████████████████████████████████████████████████████| 772/772 [00:00<00:00, 1.97MB/s]
generation_config.json: 100%|█████████████████████████████████████████████████████████████████| 121/121 [00:00<00:00, 398kB/s]
alpha-instruct.png: 100%|███████████████████████████████████████████████████████████████████| 116k/116k [00:00<00:00, 667kB/s]
model.safetensors.index.json: 100%|██████████████████████████████████████████████████████| 23.9k/23.9k [00:00<00:00, 15.3MB/s]
special_tokens_map.json: 100%|███████████████████████████████████████████████████████████████| 350/350 [00:00<00:00, 5.56MB/s]
tokenizer_config.json: 100%|█████████████████████████████████████████████████████████████| 51.0k/51.0k [00:00<00:00, 12.0MB/s]
tokenizer.json: 100%|████████████████████████████████████████████████████████████████████| 9.09M/9.09M [00:01<00:00, 7.56MB/s]
model-00004-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 1.17G/1.17G [01:03<00:00, 18.4MB/s]
model-00003-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 4.92G/4.92G [01:58<00:00, 41.6MB/s]
model-00002-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 5.00G/5.00G [02:14<00:00, 37.1MB/s]
model-00001-of-00004.safetensors: 100%|██████████████████████████████████████████████████| 4.98G/4.98G [04:22<00:00, 18.9MB/s]
Fetching 13 files: 100%|██████████████████████████████████████████████████████████████████████| 13/13 [04:23<00:00, 20.27s/it]
$ cd allganize/
$ ll
total 15G
drwxrwxr-x 3 manager manager 4.0K Dec 14 04:39 .
drwxrwxr-x 26 manager manager 4.0K Dec 14 04:39 ..
-rw-rw-r-- 1 manager manager 114K Dec 14 04:34 alpha-instruct.png
drwxrwxr-x 3 manager manager 4.0K Dec 14 04:34 .cache
-rw-rw-r-- 1 manager manager 772 Dec 14 04:34 config.json
-rw-rw-r-- 1 manager manager 121 Dec 14 04:34 generation_config.json
-rw-rw-r-- 1 manager manager 1.5K Dec 14 04:34 .gitattributes
-rw-rw-r-- 1 manager manager 4.7G Dec 14 04:39 model-00001-of-00004.safetensors
-rw-rw-r-- 1 manager manager 4.7G Dec 14 04:36 model-00002-of-00004.safetensors
-rw-rw-r-- 1 manager manager 4.6G Dec 14 04:36 model-00003-of-00004.safetensors
-rw-rw-r-- 1 manager manager 1.1G Dec 14 04:35 model-00004-of-00004.safetensors
-rw-rw-r-- 1 manager manager 24K Dec 14 04:34 model.safetensors.index.json
-rw-rw-r-- 1 manager manager 5.7K Dec 14 04:34 README.md
-rw-rw-r-- 1 manager manager 350 Dec 14 04:34 special_tokens_map.json
-rw-rw-r-- 1 manager manager 50K Dec 14 04:34 tokenizer_config.json
-rw-rw-r-- 1 manager manager 8.7M Dec 14 04:34 tokenizer.json
$ du -h -d 1 .
68K ./.cache
15G .
다운로드 받은 모델을 llama.app에서 제공하는 파일 convert_hf_to_gguf.py을 통해 변환해 줍니다.
15GB 용량의 gguf 파일을 확인할 수 있습니다.
$ python convert_hf_to_gguf.py ./allganize \
--outfile allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
INFO:hf-to-gguf:Loading model: allganize
INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only
INFO:hf-to-gguf:Exporting model...
INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json'
INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00004.safetensors'
INFO:hf-to-gguf:token_embd.weight, torch.bfloat16 --> F16, shape = {4096, 128256}
...
...
...
INFO:hf-to-gguf:Set model quantization version
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:allganize-llama-3-Alpha-Ko-8B-Instruct.gguf: n_tensors = 291, total_size = 16.1G
Writing: 100%|█████████████████████████████████████████████████████████████████████████| 16.1G/16.1G [00:44<00:00, 364Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
$ ls -alh allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
-rw-rw-r-- 1 manager manager 15G Dec 14 04:46 allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
gguf 파일 기준으로 Modelfile을 생성합니다.
생성한 Modelfile을 기준으로 ollama create 명령어를 통해 Ollama에 모델을 로드합니다.
확인해보면 Ollama에서 모델을 사용할 수 있는것으로 보입니다.
# Modelfile 생성
$ echo "from ./allganize-llama-3-Alpha-Ko-8B-Instruct.gguf" > ./Modelfile
$ cat Modelfile
from ./allganize-llama-3-Alpha-Ko-8B-Instruct.gguf
$ ollama create allganize-llama-3-Alpha-Ko-8B-Instruct -f ./Modelfile
transferring model data 100%
using existing layer sha256:eccccd32404b0a2a9021c8060a5cc6917446b7dae2a9c86694b51ac338a0e4cd
using autodetected template llama3-instruct
using existing layer sha256:56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb
creating new layer sha256:4ff5f8289df199e76dfc9c3d0d9bc44624a351b1122a69beab262513d20e18e7
writing manifest
success
$ ollama list
NAME ID SIZE MODIFIED
allganize-llama-3-Alpha-Ko-8B-Instruct:latest ee863455b97f 16 GB 12 seconds ago
nomic-embed-text:latest 0a109f422b47 274 MB 9 days ago
mistral:7b f974a74358d6 4.1 GB 9 days ago
llama3.1:8b 46e0c10c039e 4.9 GB 9 days ago
Bllossom-Vision 모델 세팅
이후 찾아보니 4bit 양자화 모델은 Ollama에서 바로 활용할 수 있어서 다운로드해보았습니다.
Ollama에서 서울과기대에서 만든 Bllossom 모델을 사용하려면 해당 모델을 사용하시면 될거 같습니다.
$ ollama pull hf.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M
pulling manifest
pulling 36edb3ca5dfd... 100% ▕██████████████████████████████████████████████████████████████▏ 4.9 GB
pulling 62fbfd9ed093... 100% ▕██████████████████████████████████████████████████████████████▏ 182 B
pulling b78301c0df4d... 100% ▕██████████████████████████████████████████████████████████████▏ 38 B
pulling eef4a93c7add... 100% ▕██████████████████████████████████████████████████████████████▏ 193 B
verifying sha256 digest
writing manifest
success
$ ollama list
NAME ID SIZE MODIFIED
hf.co/MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M:latest 6d4bd7f95f75 4.9 GB 6 seconds ago
allganize-llama-3-Alpha-Ko-8B-Instruct:latest ee863455b97f 16 GB 2 minutes ago
nomic-embed-text:latest 0a109f422b47 274 MB 9 days ago
mistral:7b f974a74358d6 4.1 GB 9 days ago
llama3.1:8b 46e0c10c039e 4.9 GB 9 days ago
정리
이번 포스팅에서는 오픈 소스 LLM을 사용할 수 있도록 Ollama를 설치해보았습니다.
open-webui까지 설치하여 ChatGPT와 유사한 WEB UI도 구성해보았습니다.
허깅페이스에 있는 모델을 gguf 파일로 변환하여 Ollama에서 사용할 수 있도록 해보았습니다.
다양한 모델이 존재하기에 테스트해보며 적합한 모델을 선택해야 될거 같습니다.
[참고사이트]
'AI' 카테고리의 다른 글
[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기 (0) | 2024.11.23 |
---|---|
하이퍼 파리미터 튜닝(1) - Tracking System Mlflow 세팅 (0) | 2024.10.12 |
[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용 (0) | 2024.01.17 |
[Vision] GraphDB로 얼굴인식을?!?!(3) - GraphDB로 얼굴 인식하기 (0) | 2023.05.11 |
[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 (0) | 2023.05.07 |