입출력 토큰 제한 적용 (Ollama + MLX 모두)

- MLX: --use-paged-cache + --max-cache-blocks로 입력 8192 토큰 제한
- MLX: --kv-cache-quantization 기본 적용
- Ollama: Modelfile로 num_ctx(입력), num_predict(출력) 설정
- SETUP_MLX.md에 토큰 제한 설명 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
MyeonghoeLee 2026-03-25 22:32:57 +09:00
parent ce0233985f
commit bcd17b2951
3 changed files with 71 additions and 14 deletions

View File

@ -156,11 +156,23 @@ docker compose -f docker-compose.mlx.yml up -d
## 서버 시작 플래그 ## 서버 시작 플래그
### 토큰 제한
| 구분 | 의미 | 설정 방법 |
|------|------|-----------|
| **max_tokens (출력)** | 모델이 생성하는 최대 토큰 수 | `--max-tokens 8192` |
| **context length (입력)** | 모델이 받을 수 있는 최대 입력 토큰 수 | 모델 자체 설정 (Qwen3.5: 최대 262K) |
> 입력 길이를 제한하려면 `--use-paged-cache``--max-cache-blocks`를 조합합니다.
> `max-cache-blocks × 64(블록 사이즈) = 최대 입력 토큰 수`
>
> 예: 입력 8192 토큰 제한 → `--use-paged-cache --max-cache-blocks 128`
### 생성 파라미터 ### 생성 파라미터
| 플래그 | 기본값 | 설명 | | 플래그 | 기본값 | 설명 |
|--------|--------|------| |--------|--------|------|
| `--max-tokens` | 32768 | 최대 생성 토큰 수 (thinking + 응답 합산) | | `--max-tokens` | 32768 | 최대 **출력** 토큰 수 (thinking + 응답 합산) |
| `--default-temperature` | 모델 기본값 | Temperature (0.0~2.0) | | `--default-temperature` | 모델 기본값 | Temperature (0.0~2.0) |
| `--default-top-p` | 모델 기본값 | Nucleus Sampling | | `--default-top-p` | 모델 기본값 | Nucleus Sampling |
| `--reasoning-parser qwen3` | off | thinking 내용을 별도 필드로 추출 | | `--reasoning-parser qwen3` | off | thinking 내용을 별도 필드로 추출 |
@ -226,14 +238,16 @@ docker compose -f docker-compose.mlx.yml up -d
- `0.9` → 희귀한 토큰 배제, 안정적 - `0.9` → 희귀한 토큰 배제, 안정적
- `1.0` → 필터 없음 - `1.0` → 필터 없음
### `--max-tokens` ### `--max-tokens` (출력 토큰 제한)
한 요청에서 생성할 최대 토큰 수입니다. 한 요청에서 모델이 **생성(출력)** 수 있는 최대 토큰 수입니다.
- Qwen3.5는 **thinking 토큰 + 응답 토큰이 합산**됩니다 - Qwen3.5는 **thinking 토큰 + 응답 토큰이 합산**됩니다
- 너무 크면 thinking이 끝없이 돌 수 있음 - 너무 크면 thinking이 끝없이 돌 수 있음
- **8192 권장** - **8192 권장**
> 입력 토큰 제한(context length)은 별도 플래그가 없으며, 모델의 context window(Qwen3.5: 최대 262K)를 따릅니다. 메모리가 부족하면 `--kv-cache-quantization`이나 `--cache-memory-mb`로 간접 제한하세요.
### `--mllm` ### `--mllm`
멀티모달 모드를 활성화합니다. 이 플래그가 없으면 텍스트만 처리합니다. 멀티모달 모드를 활성화합니다. 이 플래그가 없으면 텍스트만 처리합니다.

View File

@ -12,6 +12,7 @@ MODEL="mlx-community/Qwen3.5-35B-A3B-4bit"
PORT=8090 PORT=8090
WEBUI_PORT=3000 WEBUI_PORT=3000
MAX_TOKENS=8192 MAX_TOKENS=8192
MAX_INPUT_TOKENS=8192
TEMPERATURE=0.7 TEMPERATURE=0.7
TOP_P=0.9 TOP_P=0.9
@ -205,18 +206,24 @@ echo "[6/6] vllm-mlx 서버 시작 (백그라운드)..."
echo "" echo ""
echo " 모델: $MODEL" echo " 모델: $MODEL"
echo " 포트: $PORT" echo " 포트: $PORT"
echo " max_tokens: $MAX_TOKENS" echo " max_tokens (출력): $MAX_TOKENS"
echo " max_input (입력): $MAX_INPUT_TOKENS"
echo " temperature: $TEMPERATURE" echo " temperature: $TEMPERATURE"
echo " top_p: $TOP_P" echo " top_p: $TOP_P"
echo " 모드: 멀티모달 (이미지 + 텍스트)" echo " 모드: 멀티모달 (이미지 + 텍스트)"
echo "" echo ""
# 백그라운드 실행, 로그는 파일로 # 백그라운드 실행, 로그는 파일로
MAX_CACHE_BLOCKS=$((MAX_INPUT_TOKENS / 64))
nohup vllm-mlx serve "$MODEL" \ nohup vllm-mlx serve "$MODEL" \
--port "$PORT" \ --port "$PORT" \
--max-tokens "$MAX_TOKENS" \ --max-tokens "$MAX_TOKENS" \
--default-temperature "$TEMPERATURE" \ --default-temperature "$TEMPERATURE" \
--default-top-p "$TOP_P" \ --default-top-p "$TOP_P" \
--kv-cache-quantization \
--use-paged-cache \
--max-cache-blocks "$MAX_CACHE_BLOCKS" \
--timeout 600 \ --timeout 600 \
$MLLM_FLAG > "$LOG_FILE" 2>&1 & $MLLM_FLAG > "$LOG_FILE" 2>&1 &

View File

@ -7,8 +7,13 @@ set -e
#==================================================================== #====================================================================
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
MODEL="qwen3.5:35b" BASE_MODEL="qwen3.5:35b"
CUSTOM_MODEL="qwen3.5-custom"
WEBUI_PORT=3000 WEBUI_PORT=3000
MAX_TOKENS=8192
CONTEXT_LENGTH=8192
TEMPERATURE=0.7
TOP_P=0.9
echo "============================================" echo "============================================"
echo " Qwen3.5 + Open WebUI (Ollama) 셋업" echo " Qwen3.5 + Open WebUI (Ollama) 셋업"
@ -18,7 +23,7 @@ echo ""
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# 1. 사전 요구사항 확인 # 1. 사전 요구사항 확인
#-------------------------------------------------------------------- #--------------------------------------------------------------------
echo "[1/5] 사전 요구사항 확인..." echo "[1/6] 사전 요구사항 확인..."
if ! command -v brew &>/dev/null; then if ! command -v brew &>/dev/null; then
echo "❌ Homebrew가 설치되어 있지 않습니다." echo "❌ Homebrew가 설치되어 있지 않습니다."
@ -42,7 +47,7 @@ echo ""
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# 2. Ollama 설치 및 시작 # 2. Ollama 설치 및 시작
#-------------------------------------------------------------------- #--------------------------------------------------------------------
echo "[2/5] Ollama 설치..." echo "[2/6] Ollama 설치..."
if ! command -v ollama &>/dev/null; then if ! command -v ollama &>/dev/null; then
brew install ollama brew install ollama
@ -64,18 +69,43 @@ echo ""
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# 3. 모델 다운로드 # 3. 모델 다운로드
#-------------------------------------------------------------------- #--------------------------------------------------------------------
echo "[3/5] 모델 다운로드 ($MODEL)..." echo "[3/6] 모델 다운로드 ($BASE_MODEL)..."
echo " (네트워크 속도에 따라 시간이 걸릴 수 있습니다)" echo " (네트워크 속도에 따라 시간이 걸릴 수 있습니다)"
ollama pull "$MODEL" ollama pull "$BASE_MODEL"
echo " ✓ 모델 다운로드 완료" echo " ✓ 모델 다운로드 완료"
echo "" echo ""
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# 4. Docker Compose 설정 및 실행 # 4. 커스텀 모델 생성 (파라미터 설정)
#-------------------------------------------------------------------- #--------------------------------------------------------------------
echo "[4/5] Open WebUI 실행..." echo "[4/6] 파라미터 설정..."
MODELFILE="$PROJECT_DIR/Modelfile"
cat > "$MODELFILE" << EOF
FROM $BASE_MODEL
PARAMETER num_ctx $CONTEXT_LENGTH
PARAMETER num_predict $MAX_TOKENS
PARAMETER temperature $TEMPERATURE
PARAMETER top_p $TOP_P
EOF
ollama create "$CUSTOM_MODEL" -f "$MODELFILE" 2>&1 | grep -v "^$"
echo " ✓ 커스텀 모델 생성: $CUSTOM_MODEL"
echo " 입력 컨텍스트: $CONTEXT_LENGTH 토큰"
echo " 출력 토큰: $MAX_TOKENS"
echo " temperature: $TEMPERATURE"
echo " top_p: $TOP_P"
echo ""
#--------------------------------------------------------------------
# 5. Docker Compose 설정 및 실행
#--------------------------------------------------------------------
echo "[5/6] Open WebUI 실행..."
if [ ! -f "$PROJECT_DIR/docker-compose.yml" ]; then if [ ! -f "$PROJECT_DIR/docker-compose.yml" ]; then
cat > "$PROJECT_DIR/docker-compose.yml" << EOF cat > "$PROJECT_DIR/docker-compose.yml" << EOF
@ -106,12 +136,18 @@ echo " ✓ Open WebUI 실행 중"
echo "" echo ""
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# 5. 완료 # 6. 완료
#-------------------------------------------------------------------- #--------------------------------------------------------------------
echo "[5/5] 셋업 완료!" echo "[6/6] 셋업 완료!"
echo "" echo ""
echo "============================================" echo "============================================"
echo " 브라우저에서 http://localhost:${WEBUI_PORT} 접속" echo " 브라우저에서 http://localhost:${WEBUI_PORT} 접속"
echo " (첫 접속 시 회원가입 → 첫 계정이 admin)" echo " (첫 접속 시 회원가입 → 첫 계정이 admin)"
echo " 모델 선택: $MODEL" echo ""
echo " 모델 선택: $CUSTOM_MODEL"
echo " (파라미터가 적용된 커스텀 모델)"
echo " 또는: $BASE_MODEL"
echo " (기본 설정 모델)"
echo ""
echo " 종료: ./stop-ollama.sh"
echo "============================================" echo "============================================"