Ollama Custom 프로젝트 개요 분석

Ollama Custom은 로컬 환경에서 대규모 언어 모델(LLM)을 실행하기 위한 플랫폼입니다. 이 프로젝트는 원본 Ollama를 개인적으로 커스터마이징한 버전으로, Go 언어로 구현된 고성능 LLM 실행 환경을 제공합니다.

1. 프로젝트 구조 개요

1.1 핵심 디렉토리 구성

ollama-custom/
├── main.go                 # 애플리케이션 진입점
├── cmd/                    # CLI 명령어 구현
├── server/                 # HTTP 서버 및 API 라우팅
├── api/                    # 클라이언트-서버 통신 프로토콜
├── llm/                    # LLM 런타임 엔진
├── model/                  # 모델 관리 시스템
├── template/               # 프롬프트 템플릿 엔진
├── fs/                     # 파일 시스템 추상화
├── envconfig/              # 환경 설정 관리
├── types/                  # 커스텀 타입 정의
└── runner/                 # 모델 실행 환경

1.2 프로젝트 진입점

// main.go
package main

import (
	"context"

	"github.com/spf13/cobra"

	"github.com/ollama/ollama/cmd"
)

func main() {
	cobra.CheckErr(cmd.NewCLI().ExecuteContext(context.Background()))
}

분석 포인트:

  • 단순한 진입점: 복잡한 초기화 로직 없이 Cobra CLI 프레임워크로 위임
  • 컨텍스트 활용: context.Background()로 전체 애플리케이션 생명주기 관리
  • 에러 처리: cobra.CheckErr()로 CLI 레벨에서 통합 에러 처리

2. Go 모듈 의존성 분석

2.1 핵심 의존성

// go.mod 주요 의존성
require (
    github.com/containerd/console v1.0.3      // 터미널 제어
    github.com/gin-gonic/gin v1.10.0          // HTTP 웹 프레임워크
    github.com/spf13/cobra v1.7.0             // CLI 프레임워크
    github.com/google/uuid v1.6.0             // UUID 생성
    golang.org/x/sync v0.12.0                 // 고급 동기화 프리미티브
)

의존성 특징:

  • 웹 서버: Gin을 활용한 고성능 HTTP 서버
  • CLI: Cobra를 통한 풍부한 명령행 인터페이스
  • 동시성: Go의 고급 동시성 패턴 활용
  • 시스템: 크로스 플랫폼 시스템 통합

2.2 머신러닝 특화 의존성

require (
    github.com/pdevine/tensor v0.0.0-20240510204454-f88f4562727c
    github.com/nlpodyssey/gopickle v0.3.0
    github.com/x448/float16 v0.8.4
    github.com/d4l3k/go-bfloat16 v0.0.0-20211005043715-690c3bdd05f1
)

ML 최적화:

  • 텐서 연산: 효율적인 다차원 배열 처리
  • 모델 직렬화: Python Pickle 파일 파싱
  • 수치 정밀도: Float16, BFloat16 지원으로 메모리 최적화

3. 커스터마이징 특징

3.1 개인화 목적

README.md에서 명시된 바와 같이:

[English] This project is for my personal customization and use.
[한국어] 이 프로젝트는 나 나름대로 커스터마이징 하여 사용하기 위함임.

커스터마이징 방향:

  • 개인 워크플로우에 최적화된 기능
  • 한국어 지원 강화
  • 특정 사용 사례에 맞춘 성능 튜닝

3.2 지원 모델 스펙트럼

모델 파라미터 크기 실행 명령
Gemma 3 1B 815MB ollama run gemma3:1b
Gemma 3 4B 3.3GB ollama run gemma3
Gemma 3 12B 8.1GB ollama run gemma3:12b
Gemma 3 27B 17GB ollama run gemma3:27b

4. 아키텍처 설계 원칙

4.1 모듈화 구조

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│     CLI     │────│   Server    │────│     LLM     │
│   (cmd/)    │    │ (server/)   │    │   (llm/)    │
└─────────────┘    └─────────────┘    └─────────────┘
       │                   │                   │
       └───────────────────┼───────────────────┘
                           │
                   ┌─────────────┐
                   │    Model    │
                   │  (model/)   │
                   └─────────────┘

설계 특징:

  • 관심사 분리: CLI, 서버, LLM 엔진의 명확한 역할 구분
  • 플러그인 아키텍처: 모듈 간 느슨한 결합
  • 확장성: 새로운 모델이나 기능 추가 용이

4.2 플랫폼 지원 전략

# Dockerfile의 멀티 플랫폼 지원
ARG FLAVOR=${TARGETARCH}
FROM base-${TARGETARCH} AS base

# CPU 최적화
FROM base AS cpu
RUN dnf install -y gcc-toolset-11-gcc gcc-toolset-11-gcc-c++

# GPU 가속 (CUDA)
FROM base AS cuda-12
RUN dnf install -y cuda-toolkit-${CUDA12VERSION//./-}

# AMD GPU (ROCm)
FROM base AS rocm-6
ENV PATH=/opt/rocm/hcc/bin:/opt/rocm/hip/bin:/opt/rocm/bin:$PATH

플랫폼 최적화:

  • CPU: GCC 툴체인 최적화
  • NVIDIA GPU: CUDA 12.x 지원
  • AMD GPU: ROCm 6.x 지원
  • ARM64: ARM 프로세서 네이티브 지원

5. 성능 최적화 전략

5.1 메모리 효율성

// types/syncmap을 활용한 동시성 제어
type SyncMap struct {
    mu    sync.RWMutex
    items map[string]interface{}
}

메모리 관리:

  • 동시성 안전: sync.RWMutex를 통한 읽기/쓰기 분리
  • 타입 안전성: 제네릭을 활용한 타입 보장
  • 메모리 풀링: 대용량 모델 로딩 최적화

5.2 I/O 최적화

// envconfig를 통한 설정 최적화
type Config struct {
    ModelPath    string `env:"OLLAMA_MODELS"`
    Host         string `env:"OLLAMA_HOST"`
    Port         int    `env:"OLLAMA_PORT"`
    Debug        bool   `env:"OLLAMA_DEBUG"`
}

I/O 전략:

  • 환경 변수 기반: 런타임 설정 변경
  • 캐싱 시스템: 모델 로딩 시간 단축
  • 스트리밍: 대용량 파일 처리 최적화

6. 보안 및 안정성

6.1 타입 안전성

// types/errtypes을 통한 에러 타입 시스템
type ModelError struct {
    Model   string
    Message string
    Code    int
}

func (e ModelError) Error() string {
    return fmt.Sprintf("model %s: %s (code: %d)", e.Model, e.Message, e.Code)
}

안전성 보장:

  • 강타입 에러: 에러 상황별 구체적인 타입 정의
  • 컨텍스트 보존: 에러 발생 시점의 상세 정보 유지
  • 복구 가능성: 에러 종류별 적절한 복구 전략

6.2 암호화 지원

// crypto/ed25519를 활용한 키 관리
privateKey, publicKey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
    return fmt.Errorf("failed to generate key: %w", err)
}

7. 개발 도구 및 빌드 시스템

7.1 빌드 자동화

# scripts/build_linux.sh
#!/bin/bash
set -e

# 플랫폼별 최적화 빌드
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -tags cuda
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 go build -tags rocm

7.2 테스트 전략

server/
├── routes_test.go          # API 라우팅 테스트
├── model_test.go           # 모델 로딩 테스트
├── sched_test.go           # 스케줄링 테스트
└── testdata/               # 테스트 데이터

8. 결론

Ollama Custom은 현대적인 Go 개발 패턴을 적용한 고품질 LLM 플랫폼입니다:

8.1 주요 강점

  • 모듈화된 아키텍처: 유지보수 및 확장 용이성
  • 크로스 플랫폼: CPU, GPU, ARM 모든 플랫폼 지원
  • 성능 최적화: 메모리, I/O, 동시성 최적화
  • 개발자 친화적: 풍부한 CLI와 API 인터페이스

8.2 커스터마이징 가치

  • 개인화: 특정 워크플로우에 맞춘 최적화
  • 현지화: 한국어 지원 강화
  • 실험적 기능: 원본에 없는 혁신적 기능 테스트

다음 포스트에서는 CLI 명령어 시스템의 상세 구현을 분석해보겠습니다.