🔴 문제: qwen3:30b가 채팅에서 500 에러

증상

  • 벤치마크: ✅ 정상 (68.69 tok/s, 1위)
  • 채팅 (Open WebUI): ❌ 500 에러 (모델 로드 실패)

원인 분석

1단계: 원격 서버 접속 및 로그 확인

1
2
# Docker ollama-1 로그 확인
docker logs ollama-1 | grep -E "error|Error|failed"

발견:

GGML_ASSERT(ggml_nbytes(src0) <= INT_MAX) failed
llama runner 프로세스 crash (exit status 2)

원인: qwen3:30b의 MoE (Mixture of Experts) 아키텍처 때문에 특정 텐서가 INT32 최대값을 초과합니다.


🔧 해결 방법: Docker → 호스트 바이너리로 전환

왜 Docker에서만 실패했나?

로컬 벤치마크 (호스트 바이너리): ✅ 성공

  • 벤치마크 스크립트가 호스트의 올라마 바이너리를 직접 사용
  • CUDA 환경이 온전히 활용됨

Docker 채팅 (컨테이너화된 ollama): ❌ 실패

  • Docker 환경에서 CUDA 드라이버 호환성 문제
  • MoE 모델의 특정 텐서 처리 실패

해결 절차

1단계: Docker 올라마 중지

1
docker stop ollama-1 ollama-2

2단계: 호스트 바이너리 ollama serve 시작

1
nohup /usr/local/bin/ollama serve > /tmp/ollama.log 2>&1 &

3단계: systemd 서비스로 자동 실행 설정

 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
sudo tee /etc/systemd/system/ollama.service > /dev/null << 'EOF'
[Unit]
Description=Ollama Service
After=network.target

[Service]
Type=simple
User=<user>
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_NUM_PARALLEL=5"
Environment="OLLAMA_MAX_QUEUE=512"
Environment="OLLAMA_KEEP_ALIVE=5m"
ExecStart=/usr/local/bin/ollama serve
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl start ollama

⚠️ 중요: 환경변수 설정

처음 실패한 방법:

1
ExecStart=/usr/local/bin/ollama serve --host 0.0.0.0:11434  # ❌ 옵션 없음

올바른 방법:

1
2
Environment="OLLAMA_HOST=0.0.0.0:11434"
ExecStart=/usr/local/bin/ollama serve  # ✅ 환경변수 사용

이유: Ollama는 --host 커맨드라인 옵션을 지원하지 않음. OLLAMA_HOST 환경변수로만 지정 가능.

병렬 처리 설정

Docker에서 사용하던 설정을 그대로 적용:

1
2
3
OLLAMA_NUM_PARALLEL=5        # 동시 5개 요청 처리
OLLAMA_MAX_QUEUE=512         # 512개까지 대기 가능
OLLAMA_KEEP_ALIVE=5m         # 5분 후 미사용 모델 자동 언로드

🌐 Nginx 프록시 문제: 502 Bad Gateway

문제 상황

설정: Main 서버 (58880) → 포트포워딩 → 원격 서버 (8080, Nginx) → ollama (11434)

결과: 502 Bad Gateway

원인 분석

1. Upstream 호스트 분석

1
docker exec ollama-nginx cat /etc/nginx/nginx.conf | grep upstream -A 5

문제:

upstream ollama_backend {
    server ollama-1:11434        # ❌ 종료된 Docker 컨테이너
    server ollama-2:11434        # ❌ 종료된 Docker 컨테이너
}

Nginx는 여전히 종료된 Docker 컨테이너들을 참조하고 있었습니다!

해결: Nginx 재구성

1단계: 기존 Nginx 삭제

1
2
docker rm -f ollama-nginx
docker run -d --name ollama-nginx -p 8080:80 nginx:alpine

2단계: 새로운 설정 적용

 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
docker exec ollama-nginx sh -c 'cat > /etc/nginx/conf.d/default.conf << EOF
server {
    listen       80;
    listen  [::]:80;

    location /api/ {
        allow all;
        
        proxy_pass http://<remote-host-ip>:11434;
        proxy_set_header Host <remote-host-ip>:11434;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;
        proxy_request_buffering off;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
EOF
'

docker exec ollama-nginx nginx -s reload

⚠️ 주의: Host 헤더

처음 시도 (실패):

1
proxy_set_header Host $host;  # ❌ 포트포워딩으로 인해 변형된 호스트명

결과: 400 Bad Request: malformed Host header

올바른 설정:

1
proxy_set_header Host <remote-host-ip>:11434;  # ✅ 올라마가 기대하는 형식

🔐 보안: VPN 경유 SSH 접속

배경

처음: SSH 직접 접속 (포트 5022)

1
ssh -p 5022 <user>@<remote-server>  # ❌ 외부 노출

최종: VPN 경유 (내부 IP)

1
2
openvpn ~/.ssh/chloe-main.ovpn
ssh -p 22 <user>@<remote-host-ip>     # ✅ VPN 필수

VPN 설정 파일

위치: ~/.ssh/chloe-main.ovpn 포트: UDP 51194


📊 최종 상태

항목상태상세
Ollama 서비스✅ 정상호스트 바이너리 + systemd
qwen3:30b✅ 정상68.69 tok/s (1위)
병렬 처리✅ 정상동시 5개, 큐 512개
포트포워딩✅ 정상외부 58880 → 내부 8080
Nginx 프록시✅ 정상:11434
SSH 접속✅ VPN내부 IP

💡 교훈

1. Docker vs 호스트 바이너리

  • CUDA 호환성: 벤치마크와 실제 환경이 다를 수 있음
  • MoE 모델: Docker에서 INT32 오버플로우 가능
  • 해결: 문제 발생 시 호스트 바이너리로 전환 검토

2. 환경변수 설정

  • Ollama는 --host 옵션 미지원 → OLLAMA_HOST 환경변수 사용
  • systemd Service에서 Environment= 섹션으로 설정

3. 프록시 설정

  • upstream에서 실제 호스트/포트 명시 (DNS 이름 아님)
  • Host 헤더는 백엔드가 기대하는 형식으로 설정

4. 포트포워딩 + 프록시

  • 포트포워딩으로 들어오는 요청의 Host 헤더가 변형됨
  • 필요시 명시적으로 백엔드 주소로 재설정

🔍 향후 개선 계획

  1. VPN 자동화 (systemd 서비스)

    • 백그라운드에서 항상 VPN 유지
    • 아침/저녁 자동 켜기/끄기
  2. iptables 접근 제어

    • Main 서버()에서만 SSH 포트 5022 허용
    • VPN 없이도 필요시 빠른 접속
  3. 모니터링 강화

    • Ollama 서비스 다운 감지
    • Nginx 상태 헬스체크

다음 단계: qwen3:30b 안정성 검증 및 다른 MoE 모델 테스트