From bcd17b2951870b52591fcf0f031f17e560e45422 Mon Sep 17 00:00:00 2001 From: MyeonghoeLee Date: Wed, 25 Mar 2026 22:32:57 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=A0=9C=ED=95=9C=20=EC=A0=81=EC=9A=A9=20(Ollama?= =?UTF-8?q?=20+=20MLX=20=EB=AA=A8=EB=91=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- SETUP_MLX.md | 20 +++++++++++++++--- setup-mlx.sh | 9 +++++++- setup-ollama.sh | 56 ++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 71 insertions(+), 14 deletions(-) diff --git a/SETUP_MLX.md b/SETUP_MLX.md index aaf2be0..385643c 100644 --- a/SETUP_MLX.md +++ b/SETUP_MLX.md @@ -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-top-p` | 모델 기본값 | Nucleus Sampling | | `--reasoning-parser qwen3` | off | thinking 내용을 별도 필드로 추출 | @@ -226,14 +238,16 @@ docker compose -f docker-compose.mlx.yml up -d - `0.9` → 희귀한 토큰 배제, 안정적 - `1.0` → 필터 없음 -### `--max-tokens` +### `--max-tokens` (출력 토큰 제한) -한 요청에서 생성할 최대 토큰 수입니다. +한 요청에서 모델이 **생성(출력)**할 수 있는 최대 토큰 수입니다. - Qwen3.5는 **thinking 토큰 + 응답 토큰이 합산**됩니다 - 너무 크면 thinking이 끝없이 돌 수 있음 - **8192 권장** +> 입력 토큰 제한(context length)은 별도 플래그가 없으며, 모델의 context window(Qwen3.5: 최대 262K)를 따릅니다. 메모리가 부족하면 `--kv-cache-quantization`이나 `--cache-memory-mb`로 간접 제한하세요. + ### `--mllm` 멀티모달 모드를 활성화합니다. 이 플래그가 없으면 텍스트만 처리합니다. diff --git a/setup-mlx.sh b/setup-mlx.sh index 101acf2..c4d0109 100755 --- a/setup-mlx.sh +++ b/setup-mlx.sh @@ -12,6 +12,7 @@ MODEL="mlx-community/Qwen3.5-35B-A3B-4bit" PORT=8090 WEBUI_PORT=3000 MAX_TOKENS=8192 +MAX_INPUT_TOKENS=8192 TEMPERATURE=0.7 TOP_P=0.9 @@ -205,18 +206,24 @@ echo "[6/6] vllm-mlx 서버 시작 (백그라운드)..." echo "" echo " 모델: $MODEL" echo " 포트: $PORT" -echo " max_tokens: $MAX_TOKENS" +echo " max_tokens (출력): $MAX_TOKENS" +echo " max_input (입력): $MAX_INPUT_TOKENS" echo " temperature: $TEMPERATURE" echo " top_p: $TOP_P" echo " 모드: 멀티모달 (이미지 + 텍스트)" echo "" # 백그라운드 실행, 로그는 파일로 +MAX_CACHE_BLOCKS=$((MAX_INPUT_TOKENS / 64)) + nohup vllm-mlx serve "$MODEL" \ --port "$PORT" \ --max-tokens "$MAX_TOKENS" \ --default-temperature "$TEMPERATURE" \ --default-top-p "$TOP_P" \ + --kv-cache-quantization \ + --use-paged-cache \ + --max-cache-blocks "$MAX_CACHE_BLOCKS" \ --timeout 600 \ $MLLM_FLAG > "$LOG_FILE" 2>&1 & diff --git a/setup-ollama.sh b/setup-ollama.sh index 9043ded..9829489 100755 --- a/setup-ollama.sh +++ b/setup-ollama.sh @@ -7,8 +7,13 @@ set -e #==================================================================== PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" -MODEL="qwen3.5:35b" +BASE_MODEL="qwen3.5:35b" +CUSTOM_MODEL="qwen3.5-custom" WEBUI_PORT=3000 +MAX_TOKENS=8192 +CONTEXT_LENGTH=8192 +TEMPERATURE=0.7 +TOP_P=0.9 echo "============================================" echo " Qwen3.5 + Open WebUI (Ollama) 셋업" @@ -18,7 +23,7 @@ echo "" #-------------------------------------------------------------------- # 1. 사전 요구사항 확인 #-------------------------------------------------------------------- -echo "[1/5] 사전 요구사항 확인..." +echo "[1/6] 사전 요구사항 확인..." if ! command -v brew &>/dev/null; then echo "❌ Homebrew가 설치되어 있지 않습니다." @@ -42,7 +47,7 @@ echo "" #-------------------------------------------------------------------- # 2. Ollama 설치 및 시작 #-------------------------------------------------------------------- -echo "[2/5] Ollama 설치..." +echo "[2/6] Ollama 설치..." if ! command -v ollama &>/dev/null; then brew install ollama @@ -64,18 +69,43 @@ echo "" #-------------------------------------------------------------------- # 3. 모델 다운로드 #-------------------------------------------------------------------- -echo "[3/5] 모델 다운로드 ($MODEL)..." +echo "[3/6] 모델 다운로드 ($BASE_MODEL)..." echo " (네트워크 속도에 따라 시간이 걸릴 수 있습니다)" -ollama pull "$MODEL" +ollama pull "$BASE_MODEL" 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 cat > "$PROJECT_DIR/docker-compose.yml" << EOF @@ -106,12 +136,18 @@ echo " ✓ Open WebUI 실행 중" echo "" #-------------------------------------------------------------------- -# 5. 완료 +# 6. 완료 #-------------------------------------------------------------------- -echo "[5/5] 셋업 완료!" +echo "[6/6] 셋업 완료!" echo "" echo "============================================" echo " 브라우저에서 http://localhost:${WEBUI_PORT} 접속" echo " (첫 접속 시 회원가입 → 첫 계정이 admin)" -echo " 모델 선택: $MODEL" +echo "" +echo " 모델 선택: $CUSTOM_MODEL" +echo " (파라미터가 적용된 커스텀 모델)" +echo " 또는: $BASE_MODEL" +echo " (기본 설정 모델)" +echo "" +echo " 종료: ./stop-ollama.sh" echo "============================================"