ollama와 Open-WebUI

LLM을 활용한 서비스가 다양하게 출시되는 요즘, 로컬에서 LLM을 사용할 수 있도록 도와주는 ollama이라는 툴에 관심이 생겼습니다.

오픈 LLM 모델의 GGUF 파일이 있다면 ollama를 이용해 로컬 환경에서 LLM과 상호작용이 가능한데요.

로컬 LLM은 개인 정보 유출 위험이 적고 비용 발생도 없다는 장점이 있습니다.

그래서 제 노트북의 로컬 환경에 직접 ollama를 실행시킨 다음, 공개된 LLM 모델을 가져와 테스트를 진행해봤습니다.

테스트를 진행한 노트북 사양은 아래와 같습니다.

  • CPU: AMD Ryzen 7 4800H with Radeon Graphics 2.90 GHz
  • RAM: 32 GB

CLI 환경에서 동작하는 ollama를 보다 쉽게 사용하기 위해, Open-WebUI라는 툴을 함께 사용했는데요.

Open-WebUI는 Chat GPT와 유사한 UI를 가지고 있고, 호스트에 실행 중인 ollama와 연동되어 웹 브라우저상에서 LLM에 질문을 하거나 다양한 LLM 관련 설정도 가능합니다.

Docker Compose를 활용하여 로컬 배포

ollama와 Open-WebUI 로컬 배포에 대해 조사해보니 모두 로컬에 직접 설치하는 글이 대부분이었지만, 각 툴이 호스트 환경으로부터 독립되어야 일관된 기능이 보장될 수 있으므로 우리는 Container 환경에서 실행해보도록 하겠습니다.

다행히 ollamaOpen-WebUI 모두 공식 Container Image가 공개되어 있어서 Docker로 실행하는 데엔 어려움이 없겠는데요.

하지만 로컬 LLM을 사용하고 종료할 때마다 이 툴들의 Container Image를 실행하고 다시 종료하려면 손이 많이 갈 것 같습니다.

그래서 여러 Container를 한 번에 배포할 수 있는 Docker Compose를 활용하도록 하겠습니다.

Docker Compose한 개 이상의 Container를 항상 동일한 옵션과 조건으로 한 번에 실행할 수 있도록 도와주는 기능입니다. Container 실행에 필요한 각종 정보를 compose.yaml이라는 파일에 정의해두었다가, docker compose 명령어를 실행하면 yaml 파일에 정의된 Container들이 실행되는 방식입니다.

배포 과정

먼저 아래와 같이 Docker Compose 파일을 정의합니다.

services:
  openWebUI:
    image: ghcr.io/open-webui/open-webui:main
    restart: always
    ports:
      - "3000:8080"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - open-webui-local:/app/backend/data
 
  ollama:
    image: ollama/ollama:0.1.34
    ports:
      - "11434:11434"
    volumes:
      - ollama-local:/root/.ollama
 
volumes:
  ollama-local:
    external: true
  open-webui-local:
    external: true

다음은 Docker Volume 생성입니다. Volume은 Container 동작 중에 생성/수정되는 데이터를 저장하는 공간인데요. 위 compose.yaml에서 정의한 바와 같이, ollama-local(ollama의 데이터 저장)와 open-webui-local(Open-WehUI의 데이터 저장)라는 이름의 Docker volume을 생성하기 위해 터미널에서 아래 명령어를 실행합니다.

  • docker volume create ollama-local
  • docker volume create open-webui-local

이제 docker compose 명령어로 두 개의 Container를 로컬에 배포해볼 건데요. 그 전에 compose.yaml 파일이 정상적으로 실행되는지 확인하기 위해 아래 명령어로 dry run을 해보겠습니다. (dry-run은 어떤 명령어가 예상대로 동작하는지 모의 실행하는 것을 말합니다. 해당 명령어가 실제로 실행되는 것은 아닙니다.)

  • docker compose --dry-run up -d (compose.yaml 파일이 존재하는 경로에서 실행)

dry run이 잘 실행되는 것을 확인했으니 이제 아래 명령어를 실행하여 실제로 로컬 배포를 진행해보겠습니다.

  • docker compose up -d (compose.yaml 파일이 존재하는 경로에서 실행)

각 Container가 정상 실행되었다는 메시지를 확인 후, compose.yaml에서 정의한 Open-WebUIPort 번호를 참고하여 웹 브라우저에서 localhost로 접속합니다. (본 예제에서 Open-WebUI 경로: http://localhost:3000)

웹 브라우저로 접속한 Open-WebUI 창에서 Sign up 버튼을 눌러 계정을 새로 만들고 접속합니다. (이렇게 만든 계정은 우리가 이전에 생성한 Open-WebUIDocker Volume에 저장되므로 Sign up은 최초 한 번만 필요하며, 이후엔 계정으로 로그인하면 됩니다.)

아직 ollama에서 사용할 LLM 모델이 없으므로, Open-WebUI의 오른쪽 상단의 톱니바퀴 버튼을 누른 뒤 models 메뉴 내 Pull a model from Ollama.com 옵션 입력창에 원하는 LLM 모델의 태그를 입력합니다. (본 예제에서는 llama3:8b를 가져왔습니다. ollama에서 제공하는 LLM 목록은 여기서 확인 가능합니다.)

LLM 모델 다운로드가 완료되면 홈 화면의 왼쪽 상단에서 다운로드한 모델 선택이 가능하고, 이후 Chat을 진행할 수 있습니다.

로컬 배포한 Container 관리

만약 Docker Compose로 로컬 배포한 ollamaOpen-WebUI Container를 종료하고 싶다면 아래 명령어를 실행합니다.

  • docker compose down (compose.yaml 파일이 존재하는 경로에서 실행)

추후에 용량 관리를 위해 ollamaOpen-WebUI가 사용하던 Volume을 삭제하고 싶다면 아래 명령어를 실행합니다. (Backup하지 않은 Volume은 삭제 후 복구할 수 없습니다.)

  • docker volume rm {대상 Volume 이름}

References