JUST WRITE

[LLM] RAG와 LLM을 활용한 자동 분류(2) - Ollama 세팅하기 본문

AI

[LLM] RAG와 LLM을 활용한 자동 분류(2) - Ollama 세팅하기

천재보단범재 2024. 12. 14. 11:52

RAG와 LLM을 활용한 자동 분류(2)

Ollama 세팅하기

데이터를 카테고리별로 자동 분류하는 과제를 진행하고 있습니다.

LLM과 RAG를 활용해서 자동 분류를 진행하려고 합니다.

방식을 간단하게 나열해 보면 아래와 같습니다.

  • 학습에 쓰일 과거 데이터를 VectorDB에 저장한다.
  • 서버에 OpenSource 기반의 LLM을 설치한다.
  • 분류를 진행하려는 데이터를 VectorDB에서 유사한 데이터를 찾는다.
  • 찾은 데이터를 기반으로 프롬프트를 구성해서 LLM에 어떤 카테고리에 해당하는지 물어본다.

이전 포스팅에서 VectorDB 설치에 관해 정리하였습니다.

 

[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기

VectorDB 구성하기좋은 기회로 사내에서 데이터를 카테고리별로 자동 분류하는 과제를 맡게 되었습니다.엔지니어이기 때문에 분류 서비스를 만들어 본 적은 없지만,이번 기회에 다양한 것들을 도

developnote-blog.tistory.com

이번 포스팅은 2번째 포스팅으로 오픈소스 기반의 LLM 설치를 정리하겠습니다.

LLM 모델 선택

LLM(Large Language Model) 개발에 대규모 자본과 투자가 필요합니다.

이를 감당할 수 있는 것은 빅테크 기업뿐입니다.

LLM이 빠르게 독점화, 권력화 되어가고 있었습니다.

마이크로소프트가 GPT-3 독점 라이선스를 획득한 경우도 있었습니다.

 

MS, 인공지능 GPT-3 독점 라이선스 획득 - 디지털투데이 (DigitalToday)

[디지털투데이 추현우 기자] 마이크로소프트(MS)가 인공지능 개발사인 오픈AI(OpenAI)와 협력을 통해 첨단 AI 모델 'GPT-3' 독점 라이선스를 획득했다고 23일(현지시간) 발표했다. GPT-3는 오픈A...

www.digitaltoday.co.kr

하지만 이에 맞서 허깅페이스 중심으로 많은 오픈소스 LLM이 나오고 있습니다.

LLM 설명
Falcon  UAE의 TII가 개발했으며 적은 파라미터로도 뛰어난 성능을 보여주는 리소스 효율적인 모델
BLOOM  프랑스 주도로 개발된 다국어 지원에 특화된 모델로, 46개 자연어와 13개 프로그래밍 언어 지원
MPT  MosaicML이 개발한 모델로 긴 컨텍스트 처리에 강점이 있으며 32k 토큰 길이 지원
Mistral 프랑스 Mistral AI가 개발한 7B 크기의 컴팩트한 모델로 효율성과 성능의 균형이 뛰어남

BLOOM

 

빅테크 기업 중 하나인 Meta에서도 llama라는 LLM을 오픈소스로 공개하였습니다.

현재 llama 3.3까지(24/12/14 기준) 공개하였습니다.

다른 모델들에 비해 더 적은 파라미터로 높은 성능을 달성하여 효율적인 LLM으로도 유명합니다.

업데이트도 빠르고 라이선스 조건도 관대해서 다양한 파생모델이 존재합니다.

llama 3

이번 과제에서는 우선적으로 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

openweb-ui

ChatGPT와 비슷한 화면을 제공하기 때문에 사용하기 편리합니다.

로컬에 다양한 모델을 다운받고 원하는 대로 모델을 선택해서 사용할 수 있습니다.

open-webui에서 모델 선택

허깅페이스 모델 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 - ggerganov/llama.cpp: LLM inference in C/C++

LLM inference in C/C++. Contribute to ggerganov/llama.cpp development by creating an account on GitHub.

github.com

먼저 위 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 기반으로 만든 모델을 변환해보겠습니다.

 

한국어 실무 특화 '알파-인스트럭트' LLM 오픈소스 출시

올거나이즈는 한국어 실무에 강한 알파-인스트럭트 LLM을 오픈소스로 출시했습니다. 라마3(Llama3) 기반의 8B 모델로 한국어 이해도가 높아 문서 생성 및 요약 등의 실무에 특화돼 있습니다. Logickor

blog-ko.allganize.ai

$ 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 모델을 사용하려면 해당 모델을 사용하시면 될거 같습니다.

 

MLP-KTLim/llama-3-Korean-Bllossom-8B-gguf-Q4_K_M · Hugging Face

Update! [2024.06.18] 사전학습량을 250GB까지 늘린 Bllossom ELO모델로 업데이트 되었습니다. 다만 단어확장은 하지 않았습니다. 기존 단어확장된 long-context 모델을 활용하고 싶으신분은 개인연락주세요!

huggingface.co

$ 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에서 사용할 수 있도록 해보았습니다.

다양한 모델이 존재하기에 테스트해보며 적합한 모델을 선택해야 될거 같습니다.

[참고사이트]

더보기

 

728x90
반응형
Comments