콘텐츠로 이동

설정

mlxcel은 환경 변수(모든 실행에 영향을 줌)와 커맨드라인 플래그(특정 실행에 대해 환경 변수를 덮어씀)의 조합으로 설정됩니다. 이 페이지에서는 디바이스 선택과 메모리 관리를 제어하는 환경 변수, 그리고 서버 전용 설정 옵션을 설명합니다.

목차


환경 변수

아래 변수들은 시작 시 읽히며 generate 명령어와 serve 명령어 모두에 적용됩니다.

변수 설명 기본값
MLXCEL_DEVICE 런타임 디바이스를 강제 지정합니다. 허용 값: gpu, metal, cpu. 자동 (GPU 사용 가능 시 GPU)
MLXCEL_WIRED_LIMIT GPU 와이어드 메모리 한도입니다. 형식은 메모리 관리를 참조하십시오. GPU 최대 메모리
MLXCEL_MEMORY_LIMIT MLX allocator의 소프트 메모리 한도입니다. 0이 아닌 값은 mlxcel inspect와 --estimate-memory의 사용 가능 메모리 기준으로도 사용됩니다. 미설정
MLXCEL_HEADROOM_FACTOR 통합 메모리 추정기가 사용하는 런타임/activation 헤드룸 배수입니다. 0 < value <= 1.0 값은 헤드룸 항을 비활성화하고 잘못됐거나 non-positive인 값은 경고 후 기본값으로 폴백합니다. 1.20
MLXCEL_CACHE_DIR 기본 model store($MLXCEL_CACHE_DIR/models/<owner>/<name>)와 기타 mlxcel 디스크 캐시의 루트입니다. $HOME/.cache/mlxcel
MLXCEL_MODELS_DIR model-store 루트를 직접 재정의합니다. repo-id 다운로드와 조회는 추가 models/ 컴포넌트 없이 $MLXCEL_MODELS_DIR/<owner>/<name>을 사용합니다. 미설정
MLXCEL_DEFAULT_ORG slash가 없는 bare 모델 이름에 사용할 기본 HuggingFace owner입니다. mlx-community
MLXCEL_WEIGHT_MATERIALIZATION eager는 생성 모델의 체크포인트 텐서를 읽고 업로드한 뒤에 Model loaded를 보고하므로 첫 토큰에서 가중치 I/O가 발생하지 않습니다. lazy는 각 텐서를 처음 쓸 때 구체화합니다. eager
MLXCEL_EXTRA_CA_CERTS 모델 다운로드와 원격 미디어 가져오기에서 운영체제 신뢰 저장소에 더해 신뢰할 추가 루트/중간 CA의 PEM 번들(최대 1 MiB). 시스템 저장소에 루트 CA가 없는 TLS 검사 프록시 뒤에서 필요합니다. 없음
CUDA_HOME CUDA Toolkit 설치 디렉터리 경로 (Linux 전용, 빌드 타임). /usr/local/cuda
MLX_CUDA_ARCHITECTURES CUDA 커널 컴파일용 타겟 GPU SM 버전 (Linux 전용, 빌드 타임). nvidia-smi로 자동 감지
LLAMA_ARG_MODEL 기본 모델 경로 (mlxcel serve 및 mlxcel-server에서 사용). 없음
LLAMA_ARG_HOST 기본 서버 바인딩 주소. 127.0.0.1
LLAMA_ARG_PORT 기본 서버 포트. 8080
LLAMA_API_KEY 서버 인증용 API 키. 없음
LLAMA_ARG_CTX_SIZE 서버의 기본 컨텍스트 윈도우 크기. 0 (모델 기본값)
LLAMA_ARG_N_PARALLEL 기본 병렬 요청 슬롯 수. 4
LLAMA_ARG_N_PREDICT 생성당 기본 최대 토큰 수. -1 sentinel은 유효 슬롯별 컨텍스트 윈도우로 해석됩니다. -1
LLAMA_ARG_TIMEOUT HTTP 소켓 read/write 타임아웃(초). 느린 생성을 취소하지는 않습니다. 3600
MLXCEL_DECODE_TIMEOUT 요청별 디코드 워치독(초). 생성이 토큰을 더 내놓지 못하는 요청을 취소합니다. 600
LLAMA_ARG_SPEC_DRAFT_N_MAX --draft-max 값. 설정하지 않으면 LLAMA_ARG_DRAFT_MAX를 읽습니다. 서버는 이 값을 /props의 n_max로 보고하며, 제안 폭은 LLAMA_ARG_DRAFT_BLOCK_SIZE가 정합니다. 16
LLAMA_ARG_MODEL_DRAFT 독립 실행형 mlxcel-server 바이너리의 drafter 체크포인트 경로. 없음
LLAMA_ARG_DRAFT_KIND Drafter kind 재정의: dflash, mtp, full-model, prompt-lookup. mlxcel 고유 별칭은 MLXCEL_DRAFT_KIND입니다. 자동 감지
LLAMA_ARG_DRAFT_BLOCK_SIZE DFlash, MTP, full-model, prompt-lookup의 draft block size. mlxcel 고유 별칭은 MLXCEL_DRAFT_BLOCK_SIZE입니다. 초안 모델, 장치, 대상 모델 양자화로 시작 시 결정
LLAMA_ARG_CACHE_REUSE 프롬프트 캐시 활성화를 위한 llama.cpp 호환 별칭. MLXCEL_PROMPT_CACHE_ENABLED 참조
MLXCEL_PROMPT_CACHE_ENABLED 프롬프트 프리픽스 KV 캐시 활성화. true/false, 1/0, on/off를 허용합니다. true
MLXCEL_PROMPT_CACHE_CAPACITY_BYTES 프롬프트 캐시 바이트 예산. 2147483648
MLXCEL_PROMPT_CACHE_MAX_ENTRIES 프롬프트 캐시 항목 수 상한. 1024
MLXCEL_PROMPT_CACHE_TTL 프롬프트 캐시 TTL(초). 3600
MLXCEL_PROMPT_CACHE_MIN_PREFIX 캐싱 대상이 되는 최소 토큰 프리픽스 길이. 32
APC_ENABLED Automatic Prefix Caching block-hash layer. true
APC_BLOCK_SIZE APC block당 token 수. 16
APC_NUM_BLOCKS APC entry cap. 파생값
APC_HASH APC hash algorithm: sha256 또는 blake3. sha256
MLXCEL_AUDIO_QUEUE_DEPTH Audio worker queue의 대기 command 수. 8
MLXCEL_AUDIO_REQUEST_TIMEOUT_SECS Audio worker 응답 timeout. 120
LLAMA_ARG_RESPONSES_STORE_MAX_ENTRIES 저장할 /v1/responses 객체 최대 수. 1024
LLAMA_ARG_RESPONSES_STORE_TTL_SECS /v1/responses 저장소 TTL(초). 3600
LLAMA_ARG_CONVERSATION_STORE_MAX_ENTRIES 저장할 Responses API conversation transcript 최대 수. 256
LLAMA_ARG_CONVERSATION_STORE_TTL_SECS Conversation transcript TTL(초). 3600
MLXCEL_SERVER_DECODE_STORAGE 연속 배칭 디코드 스토리지 백엔드: auto, dense, paged. auto
MLXCEL_VIDEO_DIR_ALLOWLIST 로컬 video_url 파일을 허용할 디렉터리 목록(쉼표 구분). 비어 있으면 fail-closed입니다. 네이티브 비디오 계열과 frames 대체 경로 모두 시작 시 한 번만 읽으므로, 값을 바꾸거나 목록의 디렉터리를 새로 만든 뒤에는 서버를 다시 시작하십시오. 비어 있음
MLXCEL_REQUEST_MEMORY_BUDGET 단일 슬롯 Metal Nemotron-H 서빙의 요청별 메모리 예산. 런타임 메모리 상한에서 정한 예산을 낮출 수만 있으며, 잘못된 값(0, none, 빈 값, 유한하지 않거나 넘치는 값)이면 시작이 중단됩니다. 런타임 상한에서 결정
LLAMA_LOG_FILE 서버 로그를 저장할 경로. 없음 (stderr)

참고: LLAMA_ARG_ 접두사가 붙은 변수들은 의도적인 호환성 별칭입니다. 덕분에 이 변수들을 이미 설정해 둔 스크립트나 배포 설정에서 mlxcel을 llama-server의 드롭인 대체로 사용할 수 있습니다.


디바이스 선택

디바이스 선택 방식

mlxcel이 시작될 때 컴퓨트 디바이스를 다음 순서로 선택합니다.

  1. MLXCEL_DEVICE가 cpu로 설정된 경우 무조건 CPU를 사용합니다.
  2. MLXCEL_DEVICE가 gpu 또는 metal로 설정된 경우 GPU를 사용합니다(GPU가 없으면 오류가 발생합니다).
  3. 그 외의 경우 GPU가 있으면 자동으로 GPU를 사용하고 없으면 CPU를 폴백으로 사용합니다.

Apple Silicon에서 GPU는 Metal 가속 통합 메모리 디바이스입니다. Linux에서는 첫 번째 CUDA 지원 GPU(cuda:0)입니다. 현재 단일 프로세스 내 멀티 GPU 라운드 로빈은 지원되지 않으며 멀티 GPU 지원은 분산 추론 기능을 통해 처리됩니다.

CPU 모드 강제 사용

CPU 모드는 모델 정확성 디버깅이나 호환 GPU 하드웨어가 없는 머신에서 실행할 때 유용합니다.

MLXCEL_DEVICE=cpu mlxcel generate -m ./models/my-model -p "Hello"

대부분의 모델에서 CPU 추론은 GPU 추론보다 현저히 느립니다. 프로덕션 환경에서는 권장하지 않습니다.


메모리 관리

와이어드 메모리 개념

Apple Silicon에서 MLX는 "와이어드 메모리(wired memory)"를 사용합니다. 이는 디스크로 스왑되지 않도록 고정된 메모리입니다. GPU 연산에는 메모리가 상주 상태여야 하므로 와이어드 메모리가 성능을 좌우합니다. 그러나 과도하게 와이어링하면 다른 애플리케이션도 메모리를 필요로 할 때 시스템 불안정이나 OOM(메모리 부족) 오류가 발생할 수 있습니다.

MLXCEL_WIRED_LIMIT 변수는 mlxcel이 와이어링할 수 있는 GPU 메모리 양을 제어합니다.

허용 값

값 동작
미설정 또는 max 시작 시 GPU 최대값까지 와이어링합니다. Python mlx-lm의 wired-limit context 동작과 일치합니다.
0 또는 none 와이어드 한도 없음. mlxcel이 와이어드 메모리 상한을 설정하지 않습니다.
96GB, 48GB 등 지정한 양까지만 와이어링합니다. GB, MB, 바이트 단위를 지원합니다.
unlimited max의 별칭입니다.

와이어드 한도 선택

전용 머신에서 mlxcel을 주요 GPU 작업으로 실행하는 대부분의 사용자는 MLXCEL_WIRED_LIMIT을 설정하지 않은 상태(기본값)로 두는 것이 적절합니다. 이 경우 mlxcel은 모델 가중치가 상주 상태를 유지하도록 mlx-lm 패턴과 동일하게 wired limit을 GPU 최대값으로 설정합니다.

다른 프로세스로 인한 메모리 압박이 있다면 명시적인 한도를 설정하십시오.

# 128 GB 시스템에서 96 GB를 mlxcel에 할당하고 32 GB는 OS와 다른 앱을 위해 남겨둡니다
MLXCEL_WIRED_LIMIT=96GB mlxcel serve -m ./models/my-large-model --port 8080

중요: Linux(CUDA)에서는 MLXCEL_WIRED_LIMIT이 적용되지 않습니다. CUDA 메모리 관리는 CUDA 런타임이 처리합니다. Linux에서 GPU 할당을 제어하려면 표준 CUDA 환경 변수(CUDA_VISIBLE_DEVICES 등)를 사용하십시오.


서버 설정

서버 설정은 mlxcel serve 또는 mlxcel-server를 시작할 때 커맨드라인 플래그로 적용됩니다. 많은 플래그들이 위 표에서 설명한 환경 변수에서도 값을 읽어옵니다.

네트워킹 및 인증

플래그 환경 변수 기본값 설명
--host HOST LLAMA_ARG_HOST 127.0.0.1 HTTP 서버를 바인딩할 주소. 모든 인터페이스에서 연결을 허용하려면 0.0.0.0을 사용합니다.
--port PORT LLAMA_ARG_PORT 8080 수신 대기할 TCP 포트.
--api-key KEY LLAMA_API_KEY 없음 설정 시 모든 API 엔드포인트(/health와 / 제외)에서 Authorization: Bearer <key> 헤더를 요구합니다.
--api-key-file PATH 없음 없음 파일에서 API 키를 읽습니다(공백 제거). --api-key보다 우선 적용됩니다.
--timeout SECONDS LLAMA_ARG_TIMEOUT 3600 llama-server b10621과 동일한 HTTP 소켓 read/write 타임아웃. 소켓 읽기·쓰기 한 번을 제한하며 생성 자체를 제한하지 않습니다.
--decode-timeout SECONDS MLXCEL_DECODE_TIMEOUT 600 요청별 디코드 워치독. 생성이 토큰을 더 내놓지 못하는 요청을 취소합니다.
--alias NAME LLAMA_ARG_ALIAS 없음 API 응답에서 디렉터리 이름 대신 표시할 모델 별칭.

예시: 로컬 네트워크에서 접근 가능하도록 인증과 함께 서버를 시작합니다.

mlxcel serve \
    --model ./models/llama-3.1-8b-4bit \
    --host 0.0.0.0 \
    --port 8080 \
    --api-key my-secret-key

생성 기본값

아래 플래그들은 자체 값을 지정하지 않은 요청에 적용될 기본 샘플링 파라미터를 설정합니다. 요청별 파라미터는 항상 이 기본값보다 우선 적용됩니다.

플래그 기본값 설명
--ctx-size N 0 (모델 기본값) 컨텍스트 토큰 예산. 0은 모델에 설정된 최대값을 사용하고 명시 값은 활성 서버 슬롯들이 나누어 사용합니다.
--n-predict N -1 요청당 최대 생성 토큰 수. -1은 유효 슬롯별 컨텍스트 윈도우로 해석되며 서버·모델 한도를 모두 알 수 없을 때는 4096토큰으로 폴백합니다.
--temp FLOAT 0.8 기본 샘플링 온도. 0.0은 탐욕적(결정론적) 방식입니다.
--top-p FLOAT 0.9 기본 nucleus 샘플링 임계값.
--top-k N 40 기본 top-K 샘플링 한도. 0은 top-K 필터링을 비활성화합니다.
--min-p FLOAT 0.1 기본 min-P 샘플링 임계값. 0.0은 min-P 필터링을 비활성화합니다.
--seed N 없음 재현 가능한 출력을 위한 기본 랜덤 시드.
--repeat-last-n N 64 반복 페널티를 적용할 컨텍스트 윈도우 크기.
--repeat-penalty FLOAT 1.0 반복 페널티 배수. 1.0보다 큰 값은 반복을 억제합니다.
--frequency-penalty FLOAT 0.0 토큰이 등장한 빈도에 비례하여 차감하는 빈도 페널티.
--presence-penalty FLOAT 0.0 한 번이라도 등장한 토큰에서 고정값을 빼는 존재 페널티.
--dry-multiplier FLOAT 0.0 DRY(Don't Repeat Yourself) 페널티 배수. 0.0은 DRY를 비활성화합니다.
--dry-base FLOAT 1.75 매칭 길이에 따라 페널티를 스케일링하는 DRY 지수 밑값.
--dry-allowed-length N 2 DRY 페널티가 적용되기 전 최소 접미사 매치 길이.
--dry-penalty-last-n N -1 DRY 룩백 윈도우. -1은 전체 컨텍스트를 사용합니다.

연속 배칭

연속 배칭은 여러 동시 요청의 디코드 스텝을 단일 포워드 패스로 묶어 한꺼번에 처리합니다. 개별 요청의 지연 시간을 늘리지 않으면서 부하 상태의 처리량을 크게 높입니다.

플래그 기본값 설명
--n-parallel N, --parallel N 4 병렬 요청 슬롯 수. 동시성을 제어하는 주요 설정이며 명시적 --ctx-size의 기본 나눗수가 됩니다.
--max-batch-size N --n-parallel과 동일 활성 디코드 배치의 최대 시퀀스 수. 명시하면 이 값이 명시적 --ctx-size의 나눗수가 됩니다.
--max-queue-depth N 32 새 요청이 거부되기 전 프리필 큐에 대기할 수 있는 최대 요청 수.
--prefill-chunk-size N 유휴 시 2048, 디코드 중 512 프리필 청크당 토큰 수. 긴 프롬프트는 이 크기의 청크로 분할되며 청크 사이에 디코드 스텝이 끼어들어 활성 시퀀스가 대기하지 않고 계속 디코드합니다. 지정하지 않으면 서버는 다른 시퀀스가 디코드하지 않을 때 2048, 디코드 배치가 돌고 있을 때 512를 씁니다. 명시한 값, -b/--batch-size(LLAMA_ARG_BATCH), MLXCEL_PREFILL_CHUNK 중 하나를 주면 두 상태 모두 그 크기로 고정됩니다. 0으로 설정하면 청크 분할을 비활성화합니다.
--prefill-grant-interval N 16 Decode tick 단위 guaranteed-prefill fairness interval. 낮추면 TTFT가 개선되고 decode ITL이 늘며 0은 grant를 비활성화합니다.
--max-batch-prefill N 4 대기 중인 요청을 하나의 배치 프리필 패스로 합칠 최대 개수.
--max-batch-prefill-tokens N 파생값 Batched prefill 한 번의 padded-token 예산. 0이면 비활성화합니다. 지정하지 않으면 2 * max_batch_prefill * min(prefill_chunk_size, 512)이며 기본 설정에서는 4096입니다.
--enable-preemption 비활성화 활성화 시 우선순위 높은 요청이 우선순위 낮은 활성 시퀀스를 축출할 수 있습니다(축출된 시퀀스는 재프리필을 위해 다시 큐에 추가됩니다).
--preemption-policy POLICY longest-first 축출 대상 선택 방식. longest-first는 생성 토큰이 가장 많은 시퀀스를, lowest-priority는 우선순위가 가장 낮은 시퀀스를 축출합니다.
--no-batch 비활성화 배치 스케줄러를 비활성화하고 레거시 순차 처리(한 번에 하나의 요청)를 사용하여, 명시적 --ctx-size 전체를 단일 슬롯에 유지합니다.
--max-kv-size N 0 일반 non-sliding KV 캐시를 시퀀스당 N 토큰으로 제한합니다. 0이면 제한하지 않습니다.
--decode-storage-backend auto\|dense\|paged auto 연속 배칭 디코드 스토리지 백엔드를 선택합니다.
--kv-cache-budget BYTES\|auto\|none auto paged KV 블록 예산(MLXCEL_KV_CACHE_BUDGET). auto는 메모리 추정에서 값을 정하고, none이나 0은 풀 크기를 제한하지 않습니다. paged 디코드 백엔드에만 적용됩니다.
--kv-admission-watermark FRACTION 0.01 행이 디코드 중일 때 프리필 입장이 비워 두는 paged KV 블록 예산의 비율로, 0.0..=0.5 범위입니다(MLXCEL_KV_ADMISSION_WATERMARK). 이 공간을 만들기 위해 입장 단계에서 사용하지 않는 prompt-cache 프리픽스를 축출하고, 우선순위가 더 높은 요청이면 우선순위가 엄격히 낮은 행을 선점합니다. 예산 안에 들어가는 요청은 거부하지 않습니다. 0이면 꺼지고, 블록 예산이 없으면 효과가 없습니다.

llama.cpp 호환성을 위해 --ctx-size C에서 C > 0이면 서버 전체 컨텍스트 예산으로 해석합니다. 슬롯별 실제 컨텍스트 윈도우는 floor(C / active_slots)이고 active_slots는 명시된 --max-batch-size, 없으면 --n-parallel입니다. --no-batch는 슬롯 1개를 사용합니다. /health.context_size, /slots[].context_size, --estimate-memory는 이 슬롯별 값을 사용합니다. 명시 예산을 나누었을 때 슬롯당 512토큰 미만이면 시작 시 오류로 거부합니다.

예시: 고동시성 환경을 위한 서버 설정.

mlxcel serve \
    --model ./models/llama-3.1-8b-4bit \
    --port 8080 \
    --n-parallel 8 \
    --max-batch-size 8 \
    --max-queue-depth 64 \
    --prefill-chunk-size 512

이 예제처럼 --prefill-chunk-size 512를 명시하면 유휴 tick과 경합 tick 모두 512로 고정됩니다. 2048/512 적응형 기본값을 쓰려면 이 플래그를 빼십시오. 청크 분할과 KV admission watermark가 스케줄러와 어떻게 맞물리는지는 연속 배칭을 참조하십시오.

투기적 디코딩

투기적 디코딩은 drafter가 후보 토큰을 제안하고 target 모델이 이를 검증하는 방식으로 생성을 가속합니다. 서버 모드는 DFlash/MTP drafter kind, 일반 소형 체크포인트를 쓰는 full-model drafter, drafter가 필요 없는 prompt lookup(--draft-kind prompt-lookup)을 지원합니다.

플래그 기본값 설명
--draft-model PATH 없음 Drafter checkpoint입니다. 두 server binary 모두 --draft-model PATH와 --model-draft PATH를 받으며 help output의 primary spelling만 다릅니다.
--draft-max N 16 llama-server 호환을 위해 받는 옵션입니다(별칭 --draft, --spec-draft-n-max, --draft-n). 값은 /props의 n_max로 보고되며 제안 폭을 정하지는 않습니다. 제안 폭은 --draft-block-size가 정합니다.
--draft-kind dflash\|mtp\|full-model\|prompt-lookup auto drafter kind를 강제합니다. full-model은 target과 토크나이저가 같은 일반 소형 체크포인트를 실행하며, MTP도 DFlash도 아닌 읽을 수 있는 모델 디렉터리는 full-model로 감지합니다. prompt-lookup은 drafter checkpoint가 필요 없습니다(prompt lookup에 --draft-model을 함께 주면 시작이 실패합니다). 생략하면 drafter config에서 자동 감지합니다. mlxcel의 프롬프트 조회를 참조하십시오.
--draft-block-size N 시작 시 결정 DFlash, MTP, full-model block size입니다. 지정하지 않으면 초안 모델이 선언한 폭, 측정 기반 장치별 기본값, MTP와 full-model 4, DFlash 16 순으로 정합니다. 초안 블록 폭을 참조하십시오. --draft-kind prompt-lookup에서는 라운드당 최대 제안 토큰 수를 정합니다(기본값 7).
--prompt-lookup-max-batch N 2 prompt lookup 행이 자체 검증 라운드를 실행하는 활성 디코드 배치의 최대 크기입니다. 동시 행이 이보다 많으면 모든 행이 일반 배치 스텝을 탑니다. 1 이상이어야 합니다.

DFlash 예시:

mlxcel serve \
    --model ./models/qwen3.5-27b-4bit \
    --draft-model ./models/Qwen3.5-27B-DFlash \
    --draft-kind dflash \
    --draft-block-size 16 \
    --port 8080

채팅 템플릿

mlxcel은 모델의 tokenizer_config.json에서 채팅 템플릿을 자동으로 읽습니다. 사용자 지정 템플릿으로 덮어쓸 수도 있습니다.

플래그 기본값 설명
--chat-template TEMPLATE 없음 인라인 Jinja2 템플릿 문자열로 덮어씁니다.
--chat-template-file PATH 없음 Jinja2 템플릿 파일로 덮어씁니다.

템플릿 적용 우선순위:

  1. --chat-template (인라인 문자열)
  2. --chat-template-file (파일 경로)
  3. tokenizer_config.json의 chat_template 필드 (자동)
  4. 내장 폴백 템플릿

선택적 엔드포인트

플래그 기본값 설명
--metrics 비활성화 /metrics 엔드포인트를 활성화합니다 (Prometheus 호환 텍스트 형식).
--props 비활성화 /props 엔드포인트를 활성화합니다 (서버 속성).
--no-slots 기본 활성화 /slots 엔드포인트를 비활성화합니다.

웜업

기본적으로 서버는 시작 시 토큰 하나를 생성하고(그 후 버립니다) Metal 또는 CUDA 컴퓨트 파이프라인을 사전 컴파일합니다. 첫 번째 실제 요청의 지연 시간이 사라집니다.

# 웜업 비활성화 (더 빠른 시작, 단 첫 번째 요청이 느려집니다)
mlxcel serve --model ./models/my-model --no-warmup