{
  "url": "https://localai.co.kr/serving-recipe-index.json",
  "updatedAt": "2026-09-06",
  "totalCount": 315,
  "description": "하드웨어 × 모델별 로컬 LLM 속도 튜닝 및 서빙 레시피 데이터 (단일 사용자 지연시간 최적화)",
  "recipes": [
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "392 ~ 456 tok/s",
        "ttftSecondsRange": "36.0 ~ 41.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "13.9 ~ 15.4 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 769 tok/s",
        "ttftSecondsRange": "21.3 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.3 ~ 34.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "765 ~ 1,861 tok/s",
        "ttftSecondsRange": "8.8 ~ 21.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "26.9 ~ 65.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "774 ~ 1,854 tok/s",
        "ttftSecondsRange": "8.9 ~ 21.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.6 ~ 54.1 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-pro-64gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (64GB)",
      "hardwareShortName": "MBP M5 Pro 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8 27B Q4를 4K 문맥으로 적재할 때 약 17.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "161 ~ 394 tok/s",
        "ttftSecondsRange": "20.9 ~ 51.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "14.7 ~ 16.5 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 4.460000000000001,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 16GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 16GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=32768\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 16GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 15.55,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Gemma 4 26B-A4B (MoE) Q4를 4K 문맥으로 적재할 때 약 15.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-16gb",
      "hardwareName": "Apple MacBook Air M5 (16GB)",
      "hardwareShortName": "MBA M5 16GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-16gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "145 ~ 328 tok/s",
        "ttftSecondsRange": "12.6 ~ 28.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "6.5 ~ 7.3 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요.",
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 384 tok/s",
        "ttftSecondsRange": "42.7 ~ 104.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "14.7 ~ 16.5 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "308 ~ 850 tok/s",
        "ttftSecondsRange": "9.7 ~ 26.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11 ~ 30.4 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-24gb",
      "hardwareName": "Apple MacBook Air M5 (24GB)",
      "hardwareShortName": "MBA M5 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "141 ~ 320 tok/s",
        "ttftSecondsRange": "25.7 ~ 58.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "6.5 ~ 7.3 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 8.219999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 32GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 384 tok/s",
        "ttftSecondsRange": "42.7 ~ 104.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "14.7 ~ 16.5 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 17.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "306 ~ 846 tok/s",
        "ttftSecondsRange": "19.4 ~ 53.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "10.8 ~ 29.7 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 10.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "313 ~ 851 tok/s",
        "ttftSecondsRange": "9.7 ~ 26.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9.2 ~ 25.1 tok/s"
      },
      "requiredMemoryGB": 21.49,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 5.510000000000002,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m5-32gb",
      "hardwareName": "Apple MacBook Air M5 (32GB)",
      "hardwareShortName": "MBA M5 32GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m5-32gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8 27B Q4를 4K 문맥으로 적재할 때 약 17.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "129 ~ 315 tok/s",
        "ttftSecondsRange": "26.1 ~ 63.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.2 ~ 12.6 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 4.460000000000001,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M4 16GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M4 16GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=32768\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M4 16GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 15.55,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Gemma 4 26B-A4B (MoE) Q4를 4K 문맥으로 적재할 때 약 15.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-16gb",
      "hardwareName": "Apple MacBook Air M4 (16GB)",
      "hardwareShortName": "MBA M4 16GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-16gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "116 ~ 252 tok/s",
        "ttftSecondsRange": "16.4 ~ 35.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "5 ~ 5.6 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M4 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요.",
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "126 ~ 308 tok/s",
        "ttftSecondsRange": "53.3 ~ 130.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.2 ~ 12.6 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M4 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "256 ~ 748 tok/s",
        "ttftSecondsRange": "11.0 ~ 32.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9.2 ~ 26.7 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBA M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBA M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBA M4 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "팬리스 구조는 연속 서빙 시 온도로 인한 속도 하락이 생길 수 있습니다."
      ]
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-air-m4-24gb",
      "hardwareName": "Apple MacBook Air M4 (24GB)",
      "hardwareShortName": "MBA M4 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-air-m4-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "334 ~ 601 tok/s",
        "ttftSecondsRange": "27.3 ~ 49.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "13.9 ~ 15.4 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 769 tok/s",
        "ttftSecondsRange": "21.3 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.3 ~ 34.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 31.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "765 ~ 1,861 tok/s",
        "ttftSecondsRange": "8.8 ~ 21.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "26.9 ~ 65.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 24.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "774 ~ 1,854 tok/s",
        "ttftSecondsRange": "8.9 ~ 21.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.6 ~ 54.1 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-pro-48gb",
      "hardwareName": "Apple MacBook Pro M5 Pro (48GB)",
      "hardwareShortName": "MBP M5 Pro 48GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-pro-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "453 ~ 841 tok/s",
        "ttftSecondsRange": "19.5 ~ 36.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "28.5 ~ 31.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "590 ~ 1,153 tok/s",
        "ttftSecondsRange": "14.2 ~ 27.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "64.4 ~ 71.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,403 ~ 3,046 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "49.3 ~ 107.1 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,420 ~ 3,034 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.4 ~ 88.5 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-max-64gb",
      "hardwareName": "Apple MacBook Pro M5 Max (64GB)",
      "hardwareShortName": "MBP M5 Max 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8 27B Q4를 4K 문맥으로 적재할 때 약 17.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "129 ~ 315 tok/s",
        "ttftSecondsRange": "26.1 ~ 63.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.6 ~ 12.9 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 4.460000000000001,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 16GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 16GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=32768\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 16GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 15.55,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Gemma 4 26B-A4B (MoE) Q4를 4K 문맥으로 적재할 때 약 15.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-16gb",
      "hardwareName": "Apple Mac mini M4 (16GB)",
      "hardwareShortName": "Mac mini M4 16GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-16gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "116 ~ 252 tok/s",
        "ttftSecondsRange": "16.4 ~ 35.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "5.1 ~ 5.7 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "126 ~ 308 tok/s",
        "ttftSecondsRange": "53.3 ~ 130.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.6 ~ 12.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "256 ~ 748 tok/s",
        "ttftSecondsRange": "11.0 ~ 32.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9.2 ~ 26.7 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-24gb",
      "hardwareName": "Apple Mac mini M4 (24GB)",
      "hardwareShortName": "Mac mini M4 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "113 ~ 246 tok/s",
        "ttftSecondsRange": "33.5 ~ 72.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "5.1 ~ 5.7 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 8.219999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 32GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "126 ~ 308 tok/s",
        "ttftSecondsRange": "53.3 ~ 130.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.6 ~ 12.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 17.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "255 ~ 744 tok/s",
        "ttftSecondsRange": "22.1 ~ 64.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9 ~ 26.2 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 10.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "261 ~ 749 tok/s",
        "ttftSecondsRange": "11.0 ~ 31.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "7.7 ~ 22.1 tok/s"
      },
      "requiredMemoryGB": 21.49,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 5.510000000000002,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-32gb",
      "hardwareName": "Apple Mac mini M4 (32GB)",
      "hardwareShortName": "Mac mini M4 32GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-32gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "289 ~ 530 tok/s",
        "ttftSecondsRange": "7.8 ~ 14.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.3 ~ 13.7 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 625 tok/s",
        "ttftSecondsRange": "26.2 ~ 59.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 30.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "641 ~ 1,530 tok/s",
        "ttftSecondsRange": "5.4 ~ 12.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.9 ~ 54.7 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-24gb",
      "hardwareName": "Apple Mac mini M4 Pro (24GB)",
      "hardwareShortName": "Mac mini M4 Pro 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 505 tok/s",
        "ttftSecondsRange": "32.5 ~ 59.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.3 ~ 13.7 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 625 tok/s",
        "ttftSecondsRange": "26.2 ~ 59.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 30.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 31.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "638 ~ 1,523 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.4 ~ 53.5 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 24.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "645 ~ 1,517 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.8 ~ 44.2 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-48gb",
      "hardwareName": "Apple Mac mini M4 Pro (48GB)",
      "hardwareShortName": "Mac mini M4 Pro 48GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 505 tok/s",
        "ttftSecondsRange": "32.5 ~ 59.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.3 ~ 13.7 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 625 tok/s",
        "ttftSecondsRange": "26.2 ~ 59.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 30.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "638 ~ 1,523 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.4 ~ 53.5 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "645 ~ 1,517 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.8 ~ 44.2 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M4 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M4 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m4-pro-64gb",
      "hardwareName": "Apple Mac mini M4 Pro (64GB)",
      "hardwareShortName": "Mac mini M4 Pro 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m4-pro-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8 27B Q4를 4K 문맥으로 적재할 때 약 17.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "177 ~ 443 tok/s",
        "ttftSecondsRange": "18.6 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "15.2 ~ 16.9 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 4.460000000000001,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 16GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 16GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=32768\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 16GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 15.55,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Gemma 4 26B-A4B (MoE) Q4를 4K 문맥으로 적재할 때 약 15.6GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-16gb",
      "hardwareName": "Apple Mac mini M6 (16GB)",
      "hardwareShortName": "Mac mini M6 16GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 13,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-16gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 13GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "165 ~ 364 tok/s",
        "ttftSecondsRange": "11.4 ~ 25.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "7.5 ~ 8.3 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "173 ~ 432 tok/s",
        "ttftSecondsRange": "38.0 ~ 94.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.9 ~ 18.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "359 ~ 952 tok/s",
        "ttftSecondsRange": "8.6 ~ 22.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.8 ~ 34 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-24gb",
      "hardwareName": "Apple Mac mini M6 (24GB)",
      "hardwareShortName": "Mac mini M6 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "161 ~ 355 tok/s",
        "ttftSecondsRange": "23.2 ~ 51.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "7.5 ~ 8.3 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 8.219999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 32GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "173 ~ 432 tok/s",
        "ttftSecondsRange": "38.0 ~ 94.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.9 ~ 18.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 17.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "357 ~ 948 tok/s",
        "ttftSecondsRange": "17.3 ~ 46.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.6 ~ 33.3 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 10.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "365 ~ 953 tok/s",
        "ttftSecondsRange": "8.6 ~ 22.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "10.8 ~ 28.1 tok/s"
      },
      "requiredMemoryGB": 21.49,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 5.510000000000002,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M6 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M6 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M6 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m6-32gb",
      "hardwareName": "Apple Mac mini M6 (32GB)",
      "hardwareShortName": "Mac mini M6 32GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m6-32gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=4096\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "351 ~ 631 tok/s",
        "ttftSecondsRange": "6.6 ~ 11.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "13.9 ~ 15.4 tok/s"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 2.4400000000000013,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 최대 8,192토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 769 tok/s",
        "ttftSecondsRange": "21.3 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.3 ~ 34.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 10.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "769 ~ 1,871 tok/s",
        "ttftSecondsRange": "4.4 ~ 10.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.5 ~ 66.8 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 4.1899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-24gb",
      "hardwareName": "Apple Mac mini M5 Pro (24GB)",
      "hardwareShortName": "Mac mini M5 Pro 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 20,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 20GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "334 ~ 601 tok/s",
        "ttftSecondsRange": "27.3 ~ 49.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "13.9 ~ 15.4 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 769 tok/s",
        "ttftSecondsRange": "21.3 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.3 ~ 34.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 31.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "765 ~ 1,861 tok/s",
        "ttftSecondsRange": "8.8 ~ 21.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "26.9 ~ 65.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 24.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "774 ~ 1,854 tok/s",
        "ttftSecondsRange": "8.9 ~ 21.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.6 ~ 54.1 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-48gb",
      "hardwareName": "Apple Mac mini M5 Pro (48GB)",
      "hardwareShortName": "Mac mini M5 Pro 48GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "334 ~ 601 tok/s",
        "ttftSecondsRange": "27.3 ~ 49.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "13.9 ~ 15.4 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 769 tok/s",
        "ttftSecondsRange": "21.3 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.3 ~ 34.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "765 ~ 1,861 tok/s",
        "ttftSecondsRange": "8.8 ~ 21.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "26.9 ~ 65.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "774 ~ 1,854 tok/s",
        "ttftSecondsRange": "8.9 ~ 21.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.6 ~ 54.1 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Mac mini M5 Pro 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Mac mini M5 Pro 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-mini-m5-pro-64gb",
      "hardwareName": "Apple Mac mini M5 Pro (64GB)",
      "hardwareShortName": "Mac mini M5 Pro 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-mini-m5-pro-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "374 ~ 673 tok/s",
        "ttftSecondsRange": "24.4 ~ 43.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "25.3 ~ 28.1 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "472 ~ 913 tok/s",
        "ttftSecondsRange": "18.0 ~ 34.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "57.2 ~ 63.4 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,276 ~ 2,707 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "44.9 ~ 95.2 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,291 ~ 2,697 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "37.6 ~ 78.6 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m4-max-64gb",
      "hardwareName": "Apple Mac Studio M4 Max (64GB)",
      "hardwareShortName": "Studio M4 Max 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "374 ~ 673 tok/s",
        "ttftSecondsRange": "24.4 ~ 43.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "25.3 ~ 28.1 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "479 ~ 936 tok/s",
        "ttftSecondsRange": "8.8 ~ 17.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22 ~ 42.9 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 6.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "472 ~ 913 tok/s",
        "ttftSecondsRange": "18.0 ~ 34.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "57.2 ~ 63.4 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 104.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,276 ~ 2,707 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "44.9 ~ 95.2 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 97.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,291 ~ 2,697 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "37.6 ~ 78.6 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m4-max-128gb",
      "hardwareName": "Apple Mac Studio M4 Max (128GB)",
      "hardwareShortName": "Studio M4 Max 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m4-max-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "453 ~ 841 tok/s",
        "ttftSecondsRange": "19.5 ~ 36.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "28.5 ~ 31.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "590 ~ 1,153 tok/s",
        "ttftSecondsRange": "14.2 ~ 27.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "64.4 ~ 71.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 46.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,403 ~ 3,046 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "49.3 ~ 107.1 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 39.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,420 ~ 3,034 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.4 ~ 88.5 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 34.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 64GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 64GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 64GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-max-64gb",
      "hardwareName": "Apple Mac Studio M5 Max (64GB)",
      "hardwareShortName": "Studio M5 Max 64GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 56,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 56GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "453 ~ 841 tok/s",
        "ttftSecondsRange": "19.5 ~ 36.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "28.5 ~ 31.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "527 ~ 1,053 tok/s",
        "ttftSecondsRange": "7.8 ~ 15.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "24.2 ~ 48.3 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 6.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "590 ~ 1,153 tok/s",
        "ttftSecondsRange": "14.2 ~ 27.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "64.4 ~ 71.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 104.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,403 ~ 3,046 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "49.3 ~ 107.1 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 97.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,420 ~ 3,034 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.4 ~ 88.5 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-max-128gb",
      "hardwareName": "Apple Mac Studio M5 Max (128GB)",
      "hardwareShortName": "Studio M5 Max 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-max-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "571 ~ 726 tok/s",
        "ttftSecondsRange": "11.3 ~ 14.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "42.3 ~ 46.9 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 3.719999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 3090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 3090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 3090 24GB · 최대 16,384토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "968 ~ 1,232 tok/s",
        "ttftSecondsRange": "13.3 ~ 16.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "95.5 ~ 106.1 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 12.89,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 3090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 3090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 3090 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,998 ~ 2,543 tok/s",
        "ttftSecondsRange": "3.2 ~ 4.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "62.8 ~ 145.8 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 6.6899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 3090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 3090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 3090 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 4096 \\\n  -b 1024 \\\n  -ub 256 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,807 ~ 3,572 tok/s",
        "ttftSecondsRange": "1.2 ~ 1.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "58.2 ~ 146.3 tok/s"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 1.2199999999999989,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 4096 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 3090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 4096 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 3090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 3090 24GB · 최대 16,384토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-3090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 3090 (24GB)",
      "hardwareShortName": "RTX 3090 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-3090-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,203 ~ 1,240 tok/s",
        "ttftSecondsRange": "6.6 ~ 6.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "44.1 ~ 48.7 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 3.719999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 4090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 4090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 4090 24GB · 최대 16,384토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,040 ~ 2,102 tok/s",
        "ttftSecondsRange": "7.8 ~ 8.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "107.1 ~ 118.5 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 12.89,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 4090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 4090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 4090 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "4,210 ~ 4,339 tok/s",
        "ttftSecondsRange": "1.9 ~ 2.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "67.6 ~ 157 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 6.6899999999999995,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 4090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 4090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 4090 24GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "tight",
      "fitLabel": "메모리 빠듯",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 4096 \\\n  -b 1024 \\\n  -ub 256 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "5,916 ~ 6,096 tok/s",
        "ttftSecondsRange": "0.68 ~ 0.71초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "62.7 ~ 157.5 tok/s"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 1.2199999999999989,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 4096 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 4090 24GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 4096,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 4096 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "4,096",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 4090 24GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 4090 24GB · 최대 16,384토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "4K 문맥에서도 메모리 여유가 작습니다. 문맥을 늘릴 때는 적재 실패 여부를 다시 확인하세요."
      ]
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-4090-24gb",
      "hardwareName": "NVIDIA GeForce RTX 4090 (24GB)",
      "hardwareShortName": "RTX 4090 24GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 22.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-4090-24gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 22.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,189 ~ 1,341 tok/s",
        "ttftSecondsRange": "12.2 ~ 13.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "64.6 ~ 75.1 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 9.29,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 5090 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 5090 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 32768 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 5090 32GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 30.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,318 ~ 2,614 tok/s",
        "ttftSecondsRange": "6.3 ~ 7.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "198 ~ 218.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 20.89,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 5090 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 5090 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 5090 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "4,161 ~ 4,692 tok/s",
        "ttftSecondsRange": "3.5 ~ 3.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "117.8 ~ 273.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 14.16,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 5090 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 5090 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 5090 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "5,163 ~ 5,823 tok/s",
        "ttftSecondsRange": "2.8 ~ 3.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "107 ~ 268.8 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 8.59,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 5090 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 5090 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 5090 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 30.5GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5090-32gb",
      "hardwareName": "NVIDIA GeForce RTX 5090 (32GB)",
      "hardwareShortName": "RTX 5090 32GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 30.5,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5090-32gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 30.5GB를 초과합니다."
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (ROCm/HIP)",
      "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "ROCm/HIP 백엔드로 전체 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 ROCm/HIP 가속 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "38 ~ 71 tok/s",
        "ttftSecondsRange": "230.8 ~ 431.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "11.2 ~ 12.5 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 94.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Ryzen AI Max+ 395 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "Ryzen AI Max+ 통합 GPU의 ROCm/HIP 지원은 OS·드라이버·llama.cpp 빌드에 따라 달라집니다. 모델을 받기 전에 백엔드와 메모리 할당을 확인하세요."
      ]
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (ROCm/HIP)",
      "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "ROCm/HIP 백엔드로 전체 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 ROCm/HIP 가속 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "52 ~ 122 tok/s",
        "ttftSecondsRange": "67.2 ~ 157.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "15.2 ~ 21.4 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 8.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Ryzen AI Max+ 395 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "Ryzen AI Max+ 통합 GPU의 ROCm/HIP 지원은 OS·드라이버·llama.cpp 빌드에 따라 달라집니다. 모델을 받기 전에 백엔드와 메모리 할당을 확인하세요.",
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (ROCm/HIP)",
      "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "ROCm/HIP 백엔드로 전체 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 ROCm/HIP 가속 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "80 ~ 148 tok/s",
        "ttftSecondsRange": "110.7 ~ 204.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "25.4 ~ 28.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 106.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Ryzen AI Max+ 395 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "Ryzen AI Max+ 통합 GPU의 ROCm/HIP 지원은 OS·드라이버·llama.cpp 빌드에 따라 달라집니다. 모델을 받기 전에 백엔드와 메모리 할당을 확인하세요."
      ]
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (ROCm/HIP)",
      "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "ROCm/HIP 백엔드로 전체 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 ROCm/HIP 가속 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "61 ~ 234 tok/s",
        "ttftSecondsRange": "70.0 ~ 268.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.8 ~ 39.1 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 99.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Ryzen AI Max+ 395 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "Ryzen AI Max+ 통합 GPU의 ROCm/HIP 지원은 OS·드라이버·llama.cpp 빌드에 따라 달라집니다. 모델을 받기 전에 백엔드와 메모리 할당을 확인하세요."
      ]
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (ROCm/HIP)",
      "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "ROCm/HIP 백엔드로 전체 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 ROCm/HIP 가속 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "52 ~ 219 tok/s",
        "ttftSecondsRange": "74.8 ~ 315.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "15.3 ~ 38.4 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 94.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Ryzen AI Max+ 395 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (ROCm/HIP)",
          "runtimePath": "llama.cpp ROCm/HIP·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Ryzen AI Max+ 395 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "Ryzen AI Max+ 통합 GPU의 ROCm/HIP 지원은 OS·드라이버·llama.cpp 빌드에 따라 달라집니다. 모델을 받기 전에 백엔드와 메모리 할당을 확인하세요."
      ]
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 116GB를 초과합니다."
    },
    {
      "hardwareId": "amd-ryzen-ai-max-plus-395-128gb",
      "hardwareName": "AMD Ryzen AI Max+ 395 (128GB Unified)",
      "hardwareShortName": "Ryzen AI Max+ 395 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=amd-ryzen-ai-max-plus-395-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 116GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "453 ~ 841 tok/s",
        "ttftSecondsRange": "19.5 ~ 36.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "28.5 ~ 31.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "527 ~ 1,053 tok/s",
        "ttftSecondsRange": "7.8 ~ 15.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "24.2 ~ 48.3 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 6.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "590 ~ 1,153 tok/s",
        "ttftSecondsRange": "14.2 ~ 27.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "64.4 ~ 71.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 104.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,403 ~ 3,046 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "49.3 ~ 107.1 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 97.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,420 ~ 3,034 tok/s",
        "ttftSecondsRange": "5.4 ~ 11.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.4 ~ 88.5 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-max-128gb",
      "hardwareName": "Apple MacBook Pro M5 Max (128GB)",
      "hardwareShortName": "MBP M5 Max 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-max-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "610 ~ 1,130 tok/s",
        "ttftSecondsRange": "14.5 ~ 26.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "54.2 ~ 60.2 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 214.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 256GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 256GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 256GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "910 ~ 1,580 tok/s",
        "ttftSecondsRange": "10.4 ~ 18.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.8 ~ 72.5 tok/s"
      },
      "requiredMemoryGB": 108.39,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 127.61,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 256GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 256GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 256GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "865 ~ 1,586 tok/s",
        "ttftSecondsRange": "10.3 ~ 18.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "122.4 ~ 136 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 226.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 256GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 256GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 256GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,424 ~ 4,568 tok/s",
        "ttftSecondsRange": "3.6 ~ 6.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "85.2 ~ 160.6 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 219.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 256GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 256GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 256GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,452 ~ 4,551 tok/s",
        "ttftSecondsRange": "3.6 ~ 6.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "71.5 ~ 132.7 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 214.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 256GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 256GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 256GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 273 tok/s",
        "ttftSecondsRange": "15.0 ~ 26.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "81.3 ~ 90.3 tok/s"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 45.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "GLM 공식 서빙 경로와 로컬 Q4 압축 경로는 서로 다릅니다. 실제 아티팩트와 런타임 호환성을 확인하기 전에는 실행 명령을 제공하지 않습니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-ultra-256gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (256GB)",
      "hardwareShortName": "Studio M5 Ultra 256GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "218 ~ 378 tok/s",
        "ttftSecondsRange": "10.8 ~ 18.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "112.5 ~ 125 tok/s"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 236,
      "remainingMemoryGB": 55.47,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-256gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공식 vLLM 예시는 4×GB300 노드의 DP=4·EP 구성입니다. 현재 카탈로그 장비를 동일한 경로로 보지 않습니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "610 ~ 1,130 tok/s",
        "ttftSecondsRange": "14.5 ~ 26.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "54.2 ~ 60.2 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 458.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "910 ~ 1,580 tok/s",
        "ttftSecondsRange": "10.4 ~ 18.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.8 ~ 72.5 tok/s"
      },
      "requiredMemoryGB": 108.39,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 371.61,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "865 ~ 1,586 tok/s",
        "ttftSecondsRange": "10.3 ~ 18.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "122.4 ~ 136 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 470.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,424 ~ 4,568 tok/s",
        "ttftSecondsRange": "3.6 ~ 6.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "85.2 ~ 160.6 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 463.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,452 ~ 4,551 tok/s",
        "ttftSecondsRange": "3.6 ~ 6.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "71.5 ~ 132.7 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 458.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M5 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M5 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M5 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 273 tok/s",
        "ttftSecondsRange": "15.0 ~ 26.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "81.3 ~ 90.3 tok/s"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 289.78999999999996,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "GLM 공식 서빙 경로와 로컬 Q4 압축 경로는 서로 다릅니다. 실제 아티팩트와 런타임 호환성을 확인하기 전에는 실행 명령을 제공하지 않습니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m5-ultra-512gb",
      "hardwareName": "Apple Mac Studio M5 Ultra (512GB)",
      "hardwareShortName": "Studio M5 Ultra 512GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "218 ~ 378 tok/s",
        "ttftSecondsRange": "10.8 ~ 18.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "112.5 ~ 125 tok/s"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 299.47,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m5-ultra-512gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공식 vLLM 예시는 4×GB300 노드의 DP=4·EP 구성입니다. 현재 카탈로그 장비를 동일한 경로로 보지 않습니다."
      ]
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 17.56,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=qwen-3.8-27b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8 27B Q4를 4K 문맥으로 적재할 때 약 17.6GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 8192 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "775 ~ 1,028 tok/s",
        "ttftSecondsRange": "8.0 ~ 10.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "47.6 ~ 52.7 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 6.460000000000001,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX 5060 Ti 16GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 8192 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX 5060 Ti 16GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 32768 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX 5060 Ti 16GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 15.55,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Gemma 4 26B-A4B (MoE) Q4를 4K 문맥으로 적재할 때 약 15.6GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 21.28,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.6 35B-A3B (MoE) Q4를 4K 문맥으로 적재할 때 약 21.3GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-5060-ti-16gb",
      "hardwareName": "NVIDIA GeForce RTX 5060 Ti (16GB)",
      "hardwareShortName": "RTX 5060 Ti 16GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 15,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-5060-ti-16gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 15GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "430 ~ 548 tok/s",
        "ttftSecondsRange": "29.9 ~ 38.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.4 ~ 34.9 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 24.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "NVIDIA A40 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "NVIDIA A40 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "NVIDIA A40 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 46GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "839 ~ 1,068 tok/s",
        "ttftSecondsRange": "15.4 ~ 19.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "71 ~ 78.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 36.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "NVIDIA A40 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "NVIDIA A40 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "NVIDIA A40 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,506 ~ 1,917 tok/s",
        "ttftSecondsRange": "8.6 ~ 10.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "45.7 ~ 106.2 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 29.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "NVIDIA A40 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "NVIDIA A40 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "NVIDIA A40 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,872 ~ 2,382 tok/s",
        "ttftSecondsRange": "6.9 ~ 8.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.6 ~ 104.4 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 24.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "NVIDIA A40 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "NVIDIA A40 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "NVIDIA A40 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 46GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-a40-48gb",
      "hardwareName": "NVIDIA A40 (48GB)",
      "hardwareShortName": "NVIDIA A40 48GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 46,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-a40-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 46GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,193 ~ 1,459 tok/s",
        "ttftSecondsRange": "11.2 ~ 13.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "87.6 ~ 96.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 71.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX PRO 6000 96GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX PRO 6000 96GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX PRO 6000 96GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 93GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,327 ~ 2,844 tok/s",
        "ttftSecondsRange": "5.8 ~ 7.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "198 ~ 218.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 83.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX PRO 6000 96GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX PRO 6000 96GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX PRO 6000 96GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "4,177 ~ 5,105 tok/s",
        "ttftSecondsRange": "3.2 ~ 3.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "117.8 ~ 273.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 76.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX PRO 6000 96GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX PRO 6000 96GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX PRO 6000 96GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "5,191 ~ 6,345 tok/s",
        "ttftSecondsRange": "2.6 ~ 3.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "107 ~ 268.8 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 71.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "RTX PRO 6000 96GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "RTX PRO 6000 96GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "RTX PRO 6000 96GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 93GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-rtx-pro-6000-blackwell-96gb",
      "hardwareName": "NVIDIA RTX PRO 6000 Blackwell (96GB)",
      "hardwareShortName": "RTX PRO 6000 96GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 93,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-rtx-pro-6000-blackwell-96gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 93GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "141 ~ 320 tok/s",
        "ttftSecondsRange": "25.7 ~ 58.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "6.7 ~ 7.5 tok/s"
      },
      "requiredMemoryGB": 18.78,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 8.219999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=qwen-3.8-27b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 32GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 384 tok/s",
        "ttftSecondsRange": "42.7 ~ 104.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "15.2 ~ 16.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 17.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "306 ~ 846 tok/s",
        "ttftSecondsRange": "19.4 ~ 53.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "10.8 ~ 29.7 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 10.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "313 ~ 851 tok/s",
        "ttftSecondsRange": "9.7 ~ 26.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9.2 ~ 25.1 tok/s"
      },
      "requiredMemoryGB": 21.49,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 5.510000000000002,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M5 32GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M5 32GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M5 32GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m5-32gb",
      "hardwareName": "Apple MacBook Pro M5 (32GB)",
      "hardwareShortName": "MBP M5 32GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 27,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m5-32gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 27GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 505 tok/s",
        "ttftSecondsRange": "32.5 ~ 59.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "12.3 ~ 13.7 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 625 tok/s",
        "ttftSecondsRange": "26.2 ~ 59.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 30.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 31.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "638 ~ 1,523 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22.4 ~ 53.5 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 24.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "645 ~ 1,517 tok/s",
        "ttftSecondsRange": "10.8 ~ 25.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.8 ~ 44.2 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 19.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Pro 48GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Pro 48GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Pro 48GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m4-pro-48gb",
      "hardwareName": "Apple MacBook Pro M4 Pro (48GB)",
      "hardwareShortName": "MBP M4 Pro 48GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 41,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-pro-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 41GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "374 ~ 673 tok/s",
        "ttftSecondsRange": "24.4 ~ 43.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "25.3 ~ 28.1 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "479 ~ 936 tok/s",
        "ttftSecondsRange": "8.8 ~ 17.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "22 ~ 42.9 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 6.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "472 ~ 913 tok/s",
        "ttftSecondsRange": "18.0 ~ 34.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "57.2 ~ 63.4 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 104.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,276 ~ 2,707 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "44.9 ~ 95.2 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 97.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,291 ~ 2,697 tok/s",
        "ttftSecondsRange": "6.1 ~ 12.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "37.6 ~ 78.6 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M4 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M4 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M4 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m4-max-128gb",
      "hardwareName": "Apple MacBook Pro M4 Max (128GB)",
      "hardwareShortName": "MBP M4 Max 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m4-max-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "374 ~ 505 tok/s",
        "ttftSecondsRange": "32.5 ~ 43.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "37 ~ 41.1 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 458.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M3 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M3 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M3 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "910 ~ 1,229 tok/s",
        "ttftSecondsRange": "13.3 ~ 18.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.8 ~ 56.4 tok/s"
      },
      "requiredMemoryGB": 108.39,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 371.61,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M3 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M3 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M3 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "747 ~ 1,009 tok/s",
        "ttftSecondsRange": "16.2 ~ 21.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "83.5 ~ 92.8 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 470.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M3 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M3 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M3 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,424 ~ 3,553 tok/s",
        "ttftSecondsRange": "4.6 ~ 6.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "85.2 ~ 124.9 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 463.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M3 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M3 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M3 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,452 ~ 3,540 tok/s",
        "ttftSecondsRange": "4.6 ~ 6.7초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "71.5 ~ 103.2 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 458.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "Studio M3 Ultra 512GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            },
            {
              "label": "ANE 프리필",
              "value": "하드웨어 튜너 실행 후 적용",
              "reason": "지원되는 Qwen Q4 모델에서 GPU-only 기준값과 비교해 프리필 분할 비율을 장비에 맞춥니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다.",
            "ANE 튜너 결과를 적용하기 전후로 같은 4K 이상 입력의 prompt tok/s를 비교합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "Studio M3 Ultra 512GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "Studio M3 Ultra 512GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "157 ~ 212 tok/s",
        "ttftSecondsRange": "19.3 ~ 26.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "55.5 ~ 61.6 tok/s"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 289.78999999999996,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "GLM 공식 서빙 경로와 로컬 Q4 압축 경로는 서로 다릅니다. 실제 아티팩트와 런타임 호환성을 확인하기 전에는 실행 명령을 제공하지 않습니다."
      ]
    },
    {
      "hardwareId": "mac-studio-m3-ultra-512gb",
      "hardwareName": "Apple Mac Studio M3 Ultra (512GB)",
      "hardwareShortName": "Studio M3 Ultra 512GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "단일 통합 메모리 전체 적재 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "단일 메모리 풀 실험",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "218 ~ 294 tok/s",
        "ttftSecondsRange": "13.9 ~ 18.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "76.8 ~ 85.3 tok/s"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 480,
      "remainingMemoryGB": 299.47,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=mac-studio-m3-ultra-512gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공식 vLLM 예시는 4×GB300 노드의 DP=4·EP 구성입니다. 현재 카탈로그 장비를 동일한 경로로 보지 않습니다."
      ]
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "295 ~ 553 tok/s",
        "ttftSecondsRange": "29.7 ~ 55.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.6 ~ 20.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "335 ~ 702 tok/s",
        "ttftSecondsRange": "11.7 ~ 24.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "15.4 ~ 32.2 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 6.450000000000003,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 8192,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=8192\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "8,192",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "354 ~ 721 tok/s",
        "ttftSecondsRange": "22.7 ~ 46.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "41.9 ~ 46.5 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 104.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "893 ~ 2,030 tok/s",
        "ttftSecondsRange": "8.1 ~ 18.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "31.4 ~ 71.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 97.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "903 ~ 2,023 tok/s",
        "ttftSecondsRange": "8.1 ~ 18.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "26.3 ~ 59 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 92.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Max 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Max 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Max 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m3-max-128gb",
      "hardwareName": "Apple MacBook Pro M3 Max (128GB)",
      "hardwareShortName": "MBP M3 Max 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 114,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-max-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 114GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "118 ~ 264 tok/s",
        "ttftSecondsRange": "62.2 ~ 139.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "6.6 ~ 7.3 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 8.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Pro 36GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Pro 36GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "32,768",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Pro 36GB · 최대 32,768토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 30GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "142 ~ 336 tok/s",
        "ttftSecondsRange": "48.8 ~ 115.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "14.9 ~ 16.6 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 20.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Pro 36GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Pro 36GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Pro 36GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "306 ~ 846 tok/s",
        "ttftSecondsRange": "19.4 ~ 53.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "10.8 ~ 29.7 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 13.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Pro 36GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Pro 36GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "LM Studio",
          "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:1234",
          "command": "# lms ls에서 확인한 로컬 모델 식별자를 입력\nMODEL_ID=\"\"\nlms ls\nlms load \"$MODEL_ID\" --gpu=max --context-length=65536\nlms server start --port 1234",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16 · LM Studio 로드 설정",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Pro 36GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "LM Studio",
      "runtimePath": "LM Studio llama.cpp 엔진·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:1234",
      "gpuOffload": "전체 통합 메모리 오프로드 (--gpu=max)",
      "flashAttention": "LM Studio 로드 설정에서 Flash Attention 활성화",
      "kvCacheType": "F16 기본값·KV 캐시 통합 메모리 유지",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 통합 메모리 풀·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# lms ls에 나온 MLX 4비트 모델 식별자를 MODEL_ID에 입력 (GGUF와 구분)\nMODEL_ID=\"\"\nlms ls\n: \"${MODEL_ID:?MLX 모델 식별자를 입력하세요}\"\nlms load \"$MODEL_ID\" --gpu=max --context-length=16384\nlms server start --port 1234",
      "commandNotes": [
        "Flash Attention은 LM Studio 로드 설정에서 활성화하고, 로드 결과의 context_length·eval_batch_size를 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "310 ~ 843 tok/s",
        "ttftSecondsRange": "19.5 ~ 53.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "9 ~ 24.6 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 8.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "MBP M3 Pro 36GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "생성 속도 · MTP",
          "shortDescription": "기준 측정 후 모델 설정에서 네이티브 MTP를 켜고 수락률을 비교하는 구성",
          "useWhen": "코드처럼 다음 토큰이 예측 가능한 답변을 길게 만들 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard balanced",
          "commandCaption": "서버 시작 후 모델 설정에서 MTP를 켭니다. 기준값보다 실제 디코드 tok/s가 오를 때만 유지합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "네이티브 MTP",
              "value": "기준 측정 후 활성",
              "reason": "제안 토큰 수락률과 실제 디코드 tok/s를 함께 보고 유지 여부를 정합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "같은 코드·일반 문장으로 MTP 끔/켬을 각각 세 번 측정합니다."
          ],
          "tradeoffs": [
            "일반 문장에서는 MTP 수락률이 낮아 이득이 작거나 더 느릴 수 있습니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "MBP M3 Pro 36GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "oMLX",
          "runtimePath": "Apple Silicon · MLX 모델 · 메모리 가드",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8000",
          "command": "MODEL_DIR=\"$HOME/.omlx/models\"\nomlx serve \\\n  --model-dir \"$MODEL_DIR\" \\\n  --host 127.0.0.1 \\\n  --port 8000 \\\n  --max-concurrent-requests 1 \\\n  --memory-guard safe",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            },
            {
              "label": "SpecPrefill",
              "value": "8K 이상 · keep 20%부터",
              "reason": "같은 토크나이저의 소형 draft로 긴 입력의 핵심 구간을 선별하며, 품질 확인 전에는 기본값으로 쓰지 않습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다.",
            "SpecPrefill을 켠 결과와 끈 결과의 사실 누락 여부를 같은 질문으로 비교합니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "MBP M3 Pro 36GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 30GB를 초과합니다."
    },
    {
      "hardwareId": "macbook-pro-m3-pro-36gb",
      "hardwareName": "Apple MacBook Pro M3 Pro (36GB)",
      "hardwareShortName": "MBP M3 Pro 36GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 30,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=macbook-pro-m3-pro-36gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 30GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "NVFP4",
      "runtimeName": "SGLang + DFlash2",
      "runtimePath": "단일 GB10 · TP 1 · DFlash2 draft 8",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8000",
      "gpuOffload": "GB10 통합 메모리에 단일 적재",
      "flashAttention": "FlashInfer · 프리필 청크 8,192",
      "kvCacheType": "FP8 KV 캐시",
      "batchSize": 8192,
      "microBatchSize": 1024,
      "parallelRequests": 1,
      "parallelismSummary": "TP 1 · 단일 요청",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "# Docker·NVIDIA Container Toolkit·sparkrun 0.3.4 설치 후 실행\ncurl --fail --location https://localai.co.kr/recipes/qwen38-spark-dflash2.yaml --output qwen38-spark-dflash2.yaml\n# 최초 1회: 공개 재현 저장소의 이미지를 빌드합니다.\ngit clone https://github.com/MiaAI-Lab/Qwen3.8-27B-SGLang-DGX-Spark.git\n(cd Qwen3.8-27B-SGLang-DGX-Spark && bash patch/build-dflash2-image.sh --full)\nsparkrun run ./qwen38-spark-dflash2.yaml --rootful --no-follow --no-rm",
      "commandNotes": [
        "제공 YAML은 NVFP4 + DFlash2, 초안 8토큰, FP8 KV를 사용합니다. 원문 128토큰 입력·출력 측정은 47.9 tok/s입니다. 아래 긴 입력 수치는 추정이며, 이미지 태그가 바뀌면 결과도 달라질 수 있습니다."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "237 ~ 471 tok/s",
        "ttftSecondsRange": "34.8 ~ 69.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "40 ~ 48.8 tok/s"
      },
      "requiredMemoryGB": 31.16,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 84.84,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=qwen-3.8-27b&quant=NVFP4&context=16384&accel=draft_model",
      "profiles": [
        {
          "id": "spark-qwen27-published",
          "kind": "speed",
          "name": "공개 측정 재현 설정",
          "shortDescription": "NVFP4 · DFlash2 · 단일 노드 실행",
          "useWhen": "같은 모델과 런타임으로 속도를 확인할 때",
          "runtimeName": "SGLang + DFlash2",
          "runtimePath": "단일 GB10 · TP 1 · DFlash2 draft 8",
          "quantizationLabel": "NVFP4 · FP8 KV · DFlash2 초안 모델",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "# Docker·NVIDIA Container Toolkit·sparkrun 0.3.4 설치 후 실행\ncurl --fail --location https://localai.co.kr/recipes/qwen38-spark-dflash2.yaml --output qwen38-spark-dflash2.yaml\n# 최초 1회: 공개 재현 저장소의 이미지를 빌드합니다.\ngit clone https://github.com/MiaAI-Lab/Qwen3.8-27B-SGLang-DGX-Spark.git\n(cd Qwen3.8-27B-SGLang-DGX-Spark && bash patch/build-dflash2-image.sh --full)\nsparkrun run ./qwen38-spark-dflash2.yaml --rootful --no-follow --no-rm",
          "commandCaption": "제공 YAML의 모델·초안·실행 노드 수를 함께 사용합니다.",
          "settings": [
            {
              "label": "본 모델",
              "value": "RadixArk/Qwen3.8-27B-NVFP4",
              "reason": "일반 GGUF Q4 대신 이 체크포인트를 사용합니다."
            },
            {
              "label": "KV 캐시",
              "value": "FP8 KV 캐시",
              "reason": "본 모델 가중치 정밀도와 구분합니다."
            },
            {
              "label": "동시 요청",
              "value": "1개",
              "reason": "여러 요청의 합산 처리량이 아니라 한 답변의 속도를 비교합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 본 모델·초안 모델·노드 수를 확인합니다.",
            "128토큰 입력·128토큰 출력으로 같은 질문을 3회 측정합니다.",
            "긴 입력은 별도로 측정하고 원문 짧은 입력 수치와 섞지 않습니다."
          ],
          "tradeoffs": [
            "제공 YAML은 NVFP4 + DFlash2, 초안 8토큰, FP8 KV를 사용합니다. 원문 128토큰 입력·출력 측정은 47.9 tok/s입니다. 아래 긴 입력 수치는 추정이며, 이미지 태그가 바뀌면 결과도 달라질 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "외부 공개 측정 참고",
            "summary": "이 사이트가 장비에서 직접 실행한 결과는 아닙니다. 아래 계산은 긴 입력 조건의 예상치입니다.",
            "measuredDecode": "47.9 tok/s",
            "conditions": "128토큰 입력 · 128토큰 출력 · 동시 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공개 측정 경로를 재현하려면 전용 NVFP4 본 모델, 해당 초안 모델과 호환 런타임이 필요합니다. 모든 환경에서 최속을 보장하지 않습니다."
      ]
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "verified",
      "quantization": "NVFP4",
      "runtimeName": "SGLang (DGX Spark 패치 구성)",
      "runtimePath": "단일 GB10 · NVMe PLE mmap · TP 1 · NEXTN",
      "safeStartingContextTokens": 32768,
      "endpoint": "http://127.0.0.1:30000",
      "gpuOffload": "코어 125B와 MTP는 통합 메모리, 51B PLE는 NVMe mmap",
      "flashAttention": "프리필 Triton · 디코드 trtllm_mha",
      "kvCacheType": "BF16 기본값",
      "batchSize": 4096,
      "microBatchSize": 1024,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GB10 · TP 1 · 동시 요청 1개 기준",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": "# Docker와 140GB 이상 NVMe 여유 공간 필요\ngit clone https://github.com/hashd1ve/qwen38-flash-next-one-dgx-spark.git\ncd qwen38-flash-next-one-dgx-spark\n./scripts/download.sh\n./scripts/prepare.sh\nsed -i.bak 's/-p \"$PORT\":30000/-p \"127.0.0.1:$PORT:30000\"/' scripts/serve.sh\nMEMFRAC=0.85 PREFILL=4096 CTX=32768 ./scripts/serve.sh\npython3 verify.py",
      "commandNotes": [
        "첫 적재에는 가중치 준비와 그래프 캡처 시간이 필요합니다. verify.py까지 통과한 뒤 동일 프롬프트로 프리필·디코드 속도를 기록하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "별도 재현 구성",
        "ttftSecondsRange": "별도 측정 필요"
      },
      "estimatedDecode": {
        "tokPerSecRange": "위 재현 기록 참고"
      },
      "requiredMemoryGB": 105.2,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 10.799999999999997,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=32768&accel=none",
      "profiles": [
        {
          "id": "spark-measured",
          "kind": "speed",
          "name": "단일 Spark 실측 구성",
          "shortDescription": "32K 문맥에서 MTP와 디코드 전용 백엔드를 함께 쓰는 구성",
          "useWhen": "코딩과 일반 대화를 빠르게 생성하고 싶을 때",
          "runtimeName": "SGLang · GB10 패치 구성",
          "runtimePath": "단일 DGX Spark · TP 1 · NVMe PLE mmap",
          "quantizationLabel": "NVFP4 routed experts · BF16 MTP/KV",
          "contextTokens": 32768,
          "endpoint": "http://127.0.0.1:30000",
          "command": "# Docker와 140GB 이상 NVMe 여유 공간 필요\ngit clone https://github.com/hashd1ve/qwen38-flash-next-one-dgx-spark.git\ncd qwen38-flash-next-one-dgx-spark\n./scripts/download.sh\n./scripts/prepare.sh\nsed -i.bak 's/-p \"$PORT\":30000/-p \"127.0.0.1:$PORT:30000\"/' scripts/serve.sh\nMEMFRAC=0.85 PREFILL=4096 CTX=32768 ./scripts/serve.sh\npython3 verify.py",
          "commandCaption": "준비 스크립트가 SGLang 파일을 패치하고 PLE 테이블을 NVMe에 배치합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "ModelOpt NVFP4 · MTP BF16",
              "reason": "라우팅 전문가만 NVFP4이며 MTP 텐서는 원래 정밀도를 유지합니다."
            },
            {
              "label": "PLE 저장 위치",
              "value": "NVMe mmap",
              "reason": "통합 메모리의 RAM 오프로드 대신 51B PLE 테이블을 SSD에서 희소 조회합니다."
            },
            {
              "label": "어텐션 백엔드",
              "value": "prefill=triton · decode=trtllm_mha",
              "reason": "GB10에서 프리필과 디코드에 맞는 경로를 따로 사용합니다."
            },
            {
              "label": "MTP",
              "value": "NEXTN · steps 3 · top-k 1 · draft 4",
              "reason": "단계 수와 한 번에 제안하는 토큰 수를 별도 설정으로 유지합니다."
            },
            {
              "label": "KV 캐시",
              "value": "BF16 기본값",
              "reason": "가중치 FP4와 KV 캐시 정밀도를 섞어 표기하지 않습니다."
            },
            {
              "label": "실행 요청 상한",
              "value": "4",
              "reason": "서버 상한은 4개지만 실측은 실제 동시 요청 1개로 조건을 고정합니다."
            },
            {
              "label": "정적 메모리 비율",
              "value": "0.85",
              "reason": "모델, Mamba 상태와 KV 풀을 담기 위해 확인된 값입니다."
            },
            {
              "label": "프리필 청크",
              "value": "4,096",
              "reason": "32K 입력의 처리량을 우선하는 실측 구성입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "verify.py의 기본 응답·thinking 제어·GSM8K 검증이 모두 끝난 뒤 사용합니다.",
            "코드와 일반 문장을 따로 측정합니다. MTP 수락률이 달라 같은 tok/s로 보지 않습니다."
          ],
          "tradeoffs": [
            "첫 적재에는 가중치 준비와 그래프 캡처 시간이 오래 걸립니다.",
            "커스텀 패치와 컨테이너 구성이므로 SGLang 이미지를 임의로 바꾸면 재검증이 필요합니다."
          ],
          "evidence": {
            "level": "reproduced",
            "label": "단일 장비 재현 사례",
            "summary": "한 대의 GB10에서 실제 적재, 장문 검색과 품질 검증까지 수행된 구성입니다.",
            "measuredPrefill": "약 1,910 tok/s 보고",
            "measuredDecode": "코드 40.3–42.3 tok/s · 일반 문장 21.2–25.5 tok/s",
            "conditions": "DGX Spark 1대 · TP 1 · 32K 문맥 · 동시 요청 1개"
          }
        },
        {
          "id": "spark-long-context",
          "kind": "long_context",
          "name": "262K 긴 문맥",
          "shortDescription": "프리필 청크와 정적 메모리 비율을 낮춰 전체 문맥을 확보하는 구성",
          "useWhen": "긴 코드 저장소나 대용량 문서를 한 번에 넣을 때",
          "runtimeName": "SGLang · GB10 패치 구성",
          "runtimePath": "단일 DGX Spark · TP 1 · NVMe PLE mmap",
          "quantizationLabel": "NVFP4 routed experts · BF16 MTP/KV",
          "contextTokens": 262144,
          "endpoint": "http://127.0.0.1:30000",
          "command": "# Docker와 140GB 이상 NVMe 여유 공간 필요\ngit clone https://github.com/hashd1ve/qwen38-flash-next-one-dgx-spark.git\ncd qwen38-flash-next-one-dgx-spark\n./scripts/download.sh\n./scripts/prepare.sh\nsed -i.bak 's/-p \"$PORT\":30000/-p \"127.0.0.1:$PORT:30000\"/' scripts/serve.sh\nMEMFRAC=0.79 PREFILL=1024 CTX=262144 ./scripts/serve.sh\npython3 verify.py",
          "commandCaption": "긴 입력은 순차로 처리합니다. 여러 요청을 동시에 넣으면 Mamba 상태와 KV 풀이 빠르게 줄어듭니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "ModelOpt NVFP4 · MTP BF16",
              "reason": "라우팅 전문가만 NVFP4이며 MTP 텐서는 원래 정밀도를 유지합니다."
            },
            {
              "label": "PLE 저장 위치",
              "value": "NVMe mmap",
              "reason": "통합 메모리의 RAM 오프로드 대신 51B PLE 테이블을 SSD에서 희소 조회합니다."
            },
            {
              "label": "어텐션 백엔드",
              "value": "prefill=triton · decode=trtllm_mha",
              "reason": "GB10에서 프리필과 디코드에 맞는 경로를 따로 사용합니다."
            },
            {
              "label": "MTP",
              "value": "NEXTN · steps 3 · top-k 1 · draft 4",
              "reason": "단계 수와 한 번에 제안하는 토큰 수를 별도 설정으로 유지합니다."
            },
            {
              "label": "KV 캐시",
              "value": "BF16 기본값",
              "reason": "가중치 FP4와 KV 캐시 정밀도를 섞어 표기하지 않습니다."
            },
            {
              "label": "실행 요청 상한",
              "value": "4",
              "reason": "서버 상한은 4개지만 실측은 실제 동시 요청 1개로 조건을 고정합니다."
            },
            {
              "label": "정적 메모리 비율",
              "value": "0.79",
              "reason": "262K 프리필 중 임시 메모리와 시스템 여유를 남깁니다."
            },
            {
              "label": "프리필 청크",
              "value": "1,024",
              "reason": "프리필 순간 메모리 정점을 낮추는 대신 입력 처리 시간이 늘어날 수 있습니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "8K, 32K, 128K, 240K 순서로 입력을 늘리고 각 단계에서 검색 정확도를 확인합니다.",
            "긴 입력 테스트 중 다른 GPU 작업을 중단하고 시스템이 응답하는지 함께 확인합니다."
          ],
          "tradeoffs": [
            "프리필 청크가 작아 32K 이하 입력에서는 기본 실측 구성보다 느릴 수 있습니다.",
            "262K가 설정돼도 여러 개의 262K 요청을 동시에 유지한다는 뜻은 아닙니다."
          ],
          "evidence": {
            "level": "reproduced",
            "label": "긴 문맥 재현 사례",
            "summary": "최대 240K 입력까지 중간에 넣은 사실을 찾아오는 방식으로 확인된 구성입니다.",
            "conditions": "DGX Spark 1대 · mem fraction 0.79 · prefill chunk 1,024 · 순차 요청"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "SSD mmap PLE 패치가 포함된 전용 실행 경로입니다. 일반 SGLang의 RAM 오프로드 옵션만으로는 DGX Spark 통합 메모리가 줄지 않습니다.",
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "617 ~ 834 tok/s",
        "ttftSecondsRange": "19.7 ~ 26.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 30.9 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 106.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "DGX Spark 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "DGX Spark 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "DGX Spark 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,107 ~ 1,497 tok/s",
        "ttftSecondsRange": "11.0 ~ 14.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "17.9 ~ 41.6 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 99.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "DGX Spark 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "DGX Spark 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "DGX Spark 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (CUDA)",
      "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "전체 레이어 GPU 오프로드 (-ngl 999)",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "단일 GPU·요청 1개",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,375 ~ 1,861 tok/s",
        "ttftSecondsRange": "8.8 ~ 12.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.3 ~ 41 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 94.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "DGX Spark 128GB · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "DGX Spark 128GB · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (CUDA)",
          "runtimePath": "llama.cpp CUDA·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "DGX Spark 128GB · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 116GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dgx-spark-128gb",
      "hardwareName": "NVIDIA DGX Spark (128GB)",
      "hardwareShortName": "DGX Spark 128GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 116,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dgx-spark-128gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 116GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "NVFP4",
      "runtimeName": "SGLang + DSpark",
      "runtimePath": "2× GB10 · ConnectX-7 RoCE · TP 2 · DSpark block 7",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8000",
      "gpuOffload": "2×128GB 노드에 TP=2 분산 적재",
      "flashAttention": "FlashInfer · 프리필 청크 8,192",
      "kvCacheType": "원문 런타임 기본값",
      "batchSize": 8192,
      "microBatchSize": 1024,
      "parallelRequests": 1,
      "parallelismSummary": "ConnectX-7 RoCE · TP 2 · 단일 요청",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "# Docker·NVIDIA Container Toolkit·sparkrun 0.3.4 설치 후 실행\ncurl --fail --location https://localai.co.kr/recipes/qwen38-dual-spark-dspark.yaml --output qwen38-dual-spark-dspark.yaml\n# 두 노드 간 SSH와 ConnectX-7 연결을 먼저 확인하세요.\nHEAD_NODE=\"\"  # 첫 번째 Spark의 SSH 호스트\nWORKER_NODE=\"\"  # 두 번째 Spark의 SSH 호스트\n: \"${HEAD_NODE:?첫 번째 Spark 호스트를 입력하세요}\"\n: \"${WORKER_NODE:?두 번째 Spark 호스트를 입력하세요}\"\nsparkrun run ./qwen38-dual-spark-dspark.yaml --hosts \"$HEAD_NODE,$WORKER_NODE\"",
      "commandNotes": [
        "제공 YAML은 NVFP4 + DSpark, TP=2, 지정 컨테이너 digest를 사용합니다. 원문은 100Gbps 연결과 128토큰 입력·출력에서 51.8 tok/s를 보고했습니다. 아래 긴 입력 수치는 추정입니다."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "275 ~ 772 tok/s",
        "ttftSecondsRange": "21.2 ~ 59.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "43.1 ~ 52.9 tok/s"
      },
      "requiredMemoryGB": 32.6,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 199.4,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=qwen-3.8-27b&quant=NVFP4&context=16384&accel=draft_model",
      "profiles": [
        {
          "id": "spark-qwen27-published",
          "kind": "speed",
          "name": "공개 측정 재현 설정",
          "shortDescription": "NVFP4 · DSpark · 두 노드 실행",
          "useWhen": "같은 모델과 런타임으로 속도를 확인할 때",
          "runtimeName": "SGLang + DSpark",
          "runtimePath": "2× GB10 · ConnectX-7 RoCE · TP 2 · DSpark block 7",
          "quantizationLabel": "NVFP4 · DSpark 초안 모델",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8000",
          "command": "# Docker·NVIDIA Container Toolkit·sparkrun 0.3.4 설치 후 실행\ncurl --fail --location https://localai.co.kr/recipes/qwen38-dual-spark-dspark.yaml --output qwen38-dual-spark-dspark.yaml\n# 두 노드 간 SSH와 ConnectX-7 연결을 먼저 확인하세요.\nHEAD_NODE=\"\"  # 첫 번째 Spark의 SSH 호스트\nWORKER_NODE=\"\"  # 두 번째 Spark의 SSH 호스트\n: \"${HEAD_NODE:?첫 번째 Spark 호스트를 입력하세요}\"\n: \"${WORKER_NODE:?두 번째 Spark 호스트를 입력하세요}\"\nsparkrun run ./qwen38-dual-spark-dspark.yaml --hosts \"$HEAD_NODE,$WORKER_NODE\"",
          "commandCaption": "제공 YAML의 모델·초안·실행 노드 수를 함께 사용합니다.",
          "settings": [
            {
              "label": "본 모델",
              "value": "RadixArk/Qwen3.8-27B-NVFP4",
              "reason": "일반 GGUF Q4 대신 이 체크포인트를 사용합니다."
            },
            {
              "label": "KV 캐시",
              "value": "원문 런타임 기본값",
              "reason": "본 모델 가중치 정밀도와 구분합니다."
            },
            {
              "label": "동시 요청",
              "value": "1개",
              "reason": "여러 요청의 합산 처리량이 아니라 한 답변의 속도를 비교합니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 본 모델·초안 모델·노드 수를 확인합니다.",
            "128토큰 입력·128토큰 출력으로 같은 질문을 3회 측정합니다.",
            "긴 입력은 별도로 측정하고 원문 짧은 입력 수치와 섞지 않습니다."
          ],
          "tradeoffs": [
            "제공 YAML은 NVFP4 + DSpark, TP=2, 지정 컨테이너 digest를 사용합니다. 원문은 100Gbps 연결과 128토큰 입력·출력에서 51.8 tok/s를 보고했습니다. 아래 긴 입력 수치는 추정입니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "외부 공개 측정 참고",
            "summary": "이 사이트가 장비에서 직접 실행한 결과는 아닙니다. 아래 계산은 긴 입력 조건의 예상치입니다.",
            "measuredDecode": "51.8 tok/s",
            "conditions": "128토큰 입력 · 128토큰 출력 · 동시 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공개 측정 경로를 재현하려면 전용 NVFP4 본 모델, 해당 초안 모델과 호환 런타임이 필요합니다. 모든 환경에서 최속을 보장하지 않습니다."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "2노드 분산 런타임 검증 필요",
      "runtimePath": "ConnectX-7 기반 노드 간 모델 샤딩",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "2×128GB 노드에 분산 적재",
      "flashAttention": "선택한 분산 런타임에서 호환성 확인",
      "kvCacheType": "노드별 KV 캐시 배치 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2노드 분산·ConnectX-7 통신",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,012 ~ 1,936 tok/s",
        "ttftSecondsRange": "4.3 ~ 8.2초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.7 ~ 33.8 tok/s"
      },
      "requiredMemoryGB": 107.55,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 124.45,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "2대의 Spark는 단일 256GB 통합 메모리가 아닙니다. 모델이 한 노드에 들어가면 단일 Spark로 우선 실행하고, 분산은 통신 비용을 실측한 뒤 사용하세요.",
        "내장 n-gram 테이블까지 상주하므로 표시된 총 적재 메모리를 기준으로 문맥을 잡아야 합니다."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "2노드 분산 런타임 검증 필요",
      "runtimePath": "ConnectX-7 기반 노드 간 모델 샤딩",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "2×128GB 노드에 분산 적재",
      "flashAttention": "선택한 분산 런타임에서 호환성 확인",
      "kvCacheType": "노드별 KV 캐시 배치 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2노드 분산·ConnectX-7 통신",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "823 ~ 1,573 tok/s",
        "ttftSecondsRange": "5.2 ~ 10.0초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "27.8 ~ 44.5 tok/s"
      },
      "requiredMemoryGB": 8.54,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 223.46,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=gemma-4-12b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "2대의 Spark는 단일 256GB 통합 메모리가 아닙니다. 모델이 한 노드에 들어가면 단일 Spark로 우선 실행하고, 분산은 통신 비용을 실측한 뒤 사용하세요."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "2노드 분산 런타임 검증 필요",
      "runtimePath": "ConnectX-7 기반 노드 간 모델 샤딩",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "2×128GB 노드에 분산 적재",
      "flashAttention": "선택한 분산 런타임에서 호환성 확인",
      "kvCacheType": "노드별 KV 캐시 배치 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2노드 분산·ConnectX-7 통신",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,476 ~ 2,824 tok/s",
        "ttftSecondsRange": "2.9 ~ 5.6초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.3 ~ 61.2 tok/s"
      },
      "requiredMemoryGB": 15.81,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 216.19,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "2대의 Spark는 단일 256GB 통합 메모리가 아닙니다. 모델이 한 노드에 들어가면 단일 Spark로 우선 실행하고, 분산은 통신 비용을 실측한 뒤 사용하세요."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "2노드 분산 런타임 검증 필요",
      "runtimePath": "ConnectX-7 기반 노드 간 모델 샤딩",
      "safeStartingContextTokens": 8192,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "2×128GB 노드에 분산 적재",
      "flashAttention": "선택한 분산 런타임에서 호환성 확인",
      "kvCacheType": "노드별 KV 캐시 배치 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2노드 분산·ConnectX-7 통신",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,835 ~ 3,510 tok/s",
        "ttftSecondsRange": "2.4 ~ 4.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "16.6 ~ 60.2 tok/s"
      },
      "requiredMemoryGB": 21.49,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 210.51,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=8192&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "2대의 Spark는 단일 256GB 통합 메모리가 아닙니다. 모델이 한 노드에 들어가면 단일 Spark로 우선 실행하고, 분산은 통신 비용을 실측한 뒤 사용하세요."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "장치별 가중치 분할 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2개 노드/장치 분산 검증 필요",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "393 ~ 752 tok/s",
        "ttftSecondsRange": "5.5 ~ 10.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "18.5 ~ 29.6 tok/s"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 41.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "GLM 공식 서빙 경로와 로컬 Q4 압축 경로는 서로 다릅니다. 실제 아티팩트와 런타임 호환성을 확인하기 전에는 실행 명령을 제공하지 않습니다."
      ]
    },
    {
      "hardwareId": "nvidia-dual-dgx-spark-256gb",
      "hardwareName": "2× NVIDIA DGX Spark 클러스터 (256GB)",
      "hardwareShortName": "2× DGX Spark 256GB",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "experimental",
      "fitLabel": "실험적 구동",
      "supportConfidence": "experimental",
      "quantization": "Q4_K_M",
      "runtimeName": "압축 런타임 검증 필요",
      "runtimePath": "공식 서빙과 로컬 Q4 압축 경로 분리",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "장치별 가중치 분할 검증",
      "flashAttention": "선택 런타임에서 모델 호환성 확인 후 활성화",
      "kvCacheType": "기본 정밀도로 적재 후 q8_0 별도 검증",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "2개 노드/장치 분산 검증 필요",
      "usesAggregateMemory": true,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "548 ~ 1,049 tok/s",
        "ttftSecondsRange": "3.9 ~ 7.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "25.6 ~ 41 tok/s"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 232,
      "remainingMemoryGB": 51.47,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-dgx-spark-256gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": [
        "공식 vLLM 예시는 4×GB300 노드의 DP=4·EP 구성입니다. 현재 카탈로그 장비를 동일한 경로로 보지 않습니다."
      ]
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "596 ~ 1,011 tok/s",
        "ttftSecondsRange": "16.2 ~ 27.5초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "57.5 ~ 79.8 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 23.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 3090 48GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 45GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,161 ~ 1,971 tok/s",
        "ttftSecondsRange": "8.3 ~ 14.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "129.8 ~ 180.3 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 35.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 3090 48GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,085 ~ 3,537 tok/s",
        "ttftSecondsRange": "4.6 ~ 7.9초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "83.7 ~ 242.7 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 28.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 3090 48GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,591 ~ 4,396 tok/s",
        "ttftSecondsRange": "3.7 ~ 6.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "76 ~ 238.7 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 23.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 3090 48GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 3090 48GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 45GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-rtx-3090-48gb",
      "hardwareName": "2× NVIDIA GeForce RTX 3090 NVLink (48GB)",
      "hardwareShortName": "2× RTX 3090 48GB (NVLink)",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 45,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-3090-48gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 45GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,141 ~ 1,823 tok/s",
        "ttftSecondsRange": "9.0 ~ 14.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "87.6 ~ 135.3 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 39.79,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 5090 64GB (PCIe) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 77.01,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 77.0GB가 필요해 이 장비의 가용 메모리 61GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,226 ~ 3,556 tok/s",
        "ttftSecondsRange": "4.6 ~ 7.4초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "198 ~ 305.6 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 51.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 5090 64GB (PCIe) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "3,995 ~ 6,382 tok/s",
        "ttftSecondsRange": "2.6 ~ 4.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "117.8 ~ 382.7 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 44.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 5090 64GB (PCIe) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "4,965 ~ 7,932 tok/s",
        "ttftSecondsRange": "2.1 ~ 3.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "107 ~ 376.3 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 39.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× RTX 5090 64GB (PCIe) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× RTX 5090 64GB (PCIe) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 61GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-rtx-5090-64gb",
      "hardwareName": "2× NVIDIA GeForce RTX 5090 PCIe (64GB)",
      "hardwareShortName": "2× RTX 5090 64GB (PCIe)",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 61,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-rtx-5090-64gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 61GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "qwen-3.8-27b",
      "modelName": "Qwen3.8 27B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "516 ~ 876 tok/s",
        "ttftSecondsRange": "18.7 ~ 31.8초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "42.7 ~ 58.6 tok/s"
      },
      "requiredMemoryGB": 21.21,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 70.78999999999999,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=qwen-3.8-27b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× A40 96GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× A40 96GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× A40 96GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "qwen-3.8-flash-next",
      "modelName": "Qwen3.8-Flash-Next",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [
        {
          "methodId": "ple_offload",
          "name": "PLE n-gram 테이블 RAM 오프로드",
          "status": "experimental",
          "description": "51B n-gram/PLE 임베딩 테이블을 시스템 RAM으로 오프로드해 VRAM 점유를 줄입니다 (SGLang --ple-offload-embedding / vLLM VLLM_PLE_CPU_OFFLOAD=1).",
          "flag": "--ple-offload-embedding / VLLM_PLE_CPU_OFFLOAD=1"
        }
      ],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 107.13,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=qwen-3.8-flash-next&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "Qwen3.8-Flash-Next Q4를 4K 문맥으로 적재할 때 약 107.1GB가 필요해 이 장비의 가용 메모리 92GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "gemma-4-12b",
      "modelName": "Gemma 4 12B",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,007 ~ 1,709 tok/s",
        "ttftSecondsRange": "9.6 ~ 16.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "96.5 ~ 132.5 tok/s"
      },
      "requiredMemoryGB": 9.61,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 82.39,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=gemma-4-12b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× A40 96GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× A40 96GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× A40 96GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "gemma-4-26b-a4b",
      "modelName": "Gemma 4 26B-A4B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다."
        },
        {
          "methodId": "draft_model",
          "name": "보조 모델 추측 디코딩",
          "status": "experimental",
          "description": "호환되는 보조 모델이 있을 때만 별도 경로로 실험하세요. 보조 모델 추론 비용으로 더 느려질 수 있습니다."
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "1,807 ~ 3,067 tok/s",
        "ttftSecondsRange": "5.3 ~ 9.1초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "62.2 ~ 178.4 tok/s"
      },
      "requiredMemoryGB": 16.34,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 75.66,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=gemma-4-26b-a4b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× A40 96GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× A40 96GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× A40 96GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "qwen-3.6-35b-a3b",
      "modelName": "Qwen3.6 35B-A3B (MoE)",
      "fitStatus": "ready",
      "fitLabel": "메모리 적정",
      "supportConfidence": "high",
      "quantization": "Q4_K_M",
      "runtimeName": "llama.cpp (멀티 GPU)",
      "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
      "safeStartingContextTokens": 16384,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "GPU 2장에 레이어 분할·전체 오프로드",
      "flashAttention": "Flash Attention 활성화 (-fa on)",
      "kvCacheType": "q8_0 (--cache-type-k q8_0 --cache-type-v q8_0)",
      "batchSize": 2048,
      "microBatchSize": 512,
      "parallelRequests": 1,
      "parallelismSummary": "llama.cpp 레이어 분할·GPU 2장",
      "usesAggregateMemory": true,
      "accelerationOptions": [
        {
          "methodId": "ngram",
          "name": "반복 문구 가속 (Prompt Lookup)",
          "status": "supported",
          "description": "반복 구문이 많은 코드 수정·문서 요약에서만 기본값과 수락률을 비교한 뒤 켜세요 (모델 가중치 오프로드와 무관).",
          "flag": "--spec-type ngram-simple"
        },
        {
          "methodId": "mtp",
          "name": "MTP 다중 토큰 예측",
          "status": "experimental",
          "description": "공식 MTP 체크포인트와 지원 런타임을 별도로 설정한 뒤 수락률과 실제 디코드 속도를 비교해야 합니다.",
          "flag": "--spec-type draft-mtp"
        }
      ],
      "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  -m \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  -ngl 999 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  -c 16384 \\\n  -b 2048 \\\n  -ub 512 \\\n  -fa on \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1",
      "commandNotes": [
        "127.0.0.1 로컬 전용 바인딩입니다. 모델을 로드한 뒤 메모리 여유와 프리필·디코드 실측값을 확인하세요."
      ],
      "estimatedPrefill": {
        "promptTokPerSecRange": "2,246 ~ 3,812 tok/s",
        "ttftSecondsRange": "4.3 ~ 7.3초"
      },
      "estimatedDecode": {
        "tokPerSecRange": "56.5 ~ 175.4 tok/s"
      },
      "requiredMemoryGB": 21.91,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 70.09,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=qwen-3.6-35b-a3b&quant=Q4_K_M&context=16384&accel=none",
      "profiles": [
        {
          "id": "balanced",
          "kind": "balanced",
          "name": "균형 설정",
          "shortDescription": "메모리 여유를 남기고 한 사람의 응답 지연을 우선하는 시작점",
          "useWhen": "설치 직후 처음 실행하거나 매일 안정적으로 사용할 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 2048 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "먼저 이 설정으로 기준 속도를 기록한 뒤 아래 튜닝 순서를 따라 한 항목씩 바꿉니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "2,048 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다."
          ],
          "tradeoffs": [
            "문맥과 동시 요청을 보수적으로 잡아 장비의 최대 처리량보다 낮게 나올 수 있습니다."
          ],
          "evidence": {
            "level": "documented",
            "label": "런타임 문서 기반",
            "summary": "런타임 문서에 따른 시작 설정입니다. 아래 순서로 조정하며 속도를 비교하세요.",
            "conditions": "2× A40 96GB (NVLink) · Q4 · 요청 1개"
          }
        },
        {
          "id": "speed",
          "kind": "speed",
          "name": "프리필 우선",
          "shortDescription": "메모리 여유가 있을 때 논리 배치를 늘려 긴 입력 처리량을 확인하는 구성",
          "useWhen": "긴 문서나 코드 입력을 자주 읽힐 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 16384,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 16384 \\\n  --batch-size 4096 \\\n  --ubatch-size 512 \\\n  --flash-attn auto \\\n  --cache-type-k f16 \\\n  --cache-type-v f16 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "배치를 키운 뒤 피크 메모리와 첫 토큰 시간을 함께 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "16,384",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "F16",
              "reason": "메모리보다 연산 단순성과 품질 보존을 우선합니다."
            },
            {
              "label": "프리필 배치",
              "value": "4,096 / 512",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "배치 2,048과 4,096를 비교하고 TTFT가 나빠지면 이전 값으로 돌아갑니다."
          ],
          "tradeoffs": [
            "큰 프리필 배치는 순간 메모리를 더 사용합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "장비별 조정 필요",
            "summary": "가속 기능이 지원되는 조합에만 표시하며, 기본값과의 A/B 측정 후 채택하는 설정입니다.",
            "conditions": "2× A40 96GB (NVLink) · 요청 1개 · 동일 프롬프트 비교"
          }
        },
        {
          "id": "long-context",
          "kind": "long_context",
          "name": "긴 문맥",
          "shortDescription": "KV 캐시와 프리필 순간 메모리를 줄여 입력 길이를 확보하는 구성",
          "useWhen": "PDF, 긴 대화 기록이나 코드 저장소를 한 번에 넣을 때",
          "runtimeName": "llama.cpp (멀티 GPU)",
          "runtimePath": "llama.cpp CUDA 레이어 분할·로컬 Q4 GGUF",
          "quantizationLabel": "Q4_K_M (4비트 시작값)",
          "contextTokens": 65536,
          "endpoint": "http://127.0.0.1:8080",
          "command": "MODEL_PATH=\"/absolute/path/to/model.gguf\"\nllama-server \\\n  --model \"$MODEL_PATH\" \\\n  --host 127.0.0.1 \\\n  --port 8080 \\\n  --gpu-layers all \\\n  --fit on \\\n  --fit-target 2048 \\\n  --split-mode layer \\\n  --tensor-split 1,1 \\\n  --ctx-size 65536 \\\n  --batch-size 1024 \\\n  --ubatch-size 256 \\\n  --flash-attn auto \\\n  --cache-type-k q8_0 \\\n  --cache-type-v q8_0 \\\n  --parallel 1 \\\n  --perf",
          "commandCaption": "4K 또는 8K 입력부터 시작해 실제 작업 길이까지 두 배씩 늘리며 확인합니다.",
          "settings": [
            {
              "label": "가중치",
              "value": "Q4_K_M (4비트 시작값)",
              "reason": "모델 파일 정밀도와 KV 캐시 정밀도를 별도 항목으로 관리합니다."
            },
            {
              "label": "문맥 길이",
              "value": "65,536",
              "reason": "실제 입력 길이에 맞춰 KV 캐시와 런타임 여유를 남긴 값입니다."
            },
            {
              "label": "KV 캐시",
              "value": "Q8_0",
              "reason": "긴 문맥을 위해 캐시 점유량을 낮춥니다."
            },
            {
              "label": "프리필 배치",
              "value": "1,024 / 256",
              "reason": "앞은 논리 배치, 뒤는 실제 한 번에 처리하는 마이크로 배치입니다."
            },
            {
              "label": "동시 요청",
              "value": "1",
              "reason": "총 처리량보다 개인 사용의 첫 토큰 지연과 생성 속도를 우선합니다."
            },
            {
              "label": "메모리 여유",
              "value": "2GB 이상",
              "reason": "그래프, 임시 버퍼와 운영체제 사용량이 늘어도 스왑이나 적재 실패를 피하기 위한 최소 목표입니다."
            }
          ],
          "verificationSteps": [
            "서버 시작 로그에서 모델 적재 완료와 실제 컨텍스트 길이를 확인합니다.",
            "동시 요청 1개로 준비 실행을 한 번 한 뒤, 같은 입력을 세 번 측정해 중앙값을 기록합니다.",
            "프리필 tok/s, 디코드 tok/s, 피크 메모리를 함께 기록한 뒤 한 항목씩만 바꿉니다.",
            "긴 입력 중간에 확인 가능한 문장을 넣고 답변에서 정확히 찾는지 점검합니다.",
            "스왑이나 메모리 압축이 시작되면 문맥을 한 단계 줄입니다."
          ],
          "tradeoffs": [
            "작은 프리필 배치는 순간 메모리를 낮추지만 입력 처리량은 줄어들 수 있습니다.",
            "KV 캐시 양자화는 런타임과 모델 조합별로 출력 품질을 다시 확인해야 합니다."
          ],
          "evidence": {
            "level": "starting_point",
            "label": "메모리 계산 기반",
            "summary": "가중치와 예상 KV 캐시가 가용 메모리 안에 드는 가장 긴 보수적 구간입니다.",
            "conditions": "2× A40 96GB (NVLink) · 최대 65,536토큰 · 요청 1개"
          }
        }
      ],
      "tuningOrder": [
        {
          "step": "기준값 저장",
          "action": "준비 실행 1회 뒤 같은 입력을 3회 측정합니다. 프리필·디코드·피크 메모리의 중앙값을 기준으로 삼습니다.",
          "stopCondition": "오류가 있거나 메모리 여유가 2GB보다 작으면 다음 단계로 넘어가지 않습니다."
        },
        {
          "step": "프리필 청크 조정",
          "action": "1,024 → 2,048 → 4,096 순서로 올리며 긴 입력의 TTFT와 피크 메모리를 비교합니다.",
          "stopCondition": "TTFT가 줄지 않거나 메모리 정점이 급증하면 직전 값으로 돌아갑니다."
        },
        {
          "step": "KV 캐시 조정",
          "action": "문맥이 부족할 때만 F16/BF16 기준값과 Q8 캐시를 같은 질문으로 비교합니다.",
          "stopCondition": "출력 차이가 생기거나 필요한 문맥이 이미 확보됐다면 기본 정밀도를 유지합니다."
        },
        {
          "step": "MTP·투기 디코딩",
          "action": "지원 모델에서만 켠 뒤 코드와 일반 문장을 나눠 수락률과 실제 디코드 tok/s를 측정합니다.",
          "stopCondition": "세 번의 중앙값이 기준보다 좋아지지 않으면 끕니다."
        },
        {
          "step": "문맥 확장",
          "action": "실제로 필요한 길이까지 두 배씩 늘리고 중간 정보 검색과 스왑 여부를 확인합니다.",
          "stopCondition": "검색 정확도가 떨어지거나 스왑·메모리 압축이 시작되면 한 단계 줄입니다."
        }
      ],
      "riskLimitations": []
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "glm-5.3-flash",
      "modelName": "GLM-5.3-Flash (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 190.21,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=glm-5.3-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "GLM-5.3-Flash (MoE) Q4를 4K 문맥으로 적재할 때 약 190.2GB가 필요해 이 장비의 가용 메모리 92GB를 초과합니다."
    },
    {
      "hardwareId": "nvidia-dual-a40-96gb",
      "hardwareName": "2× NVIDIA A40 NVLink (96GB)",
      "hardwareShortName": "2× A40 96GB (NVLink)",
      "modelId": "deepseek-v4-flash",
      "modelName": "DeepSeek-V4-Flash-0731 (MoE)",
      "fitStatus": "unsupported",
      "fitLabel": "메모리 초과 (미지원)",
      "supportConfidence": "unsupported",
      "quantization": "Q4_K_M",
      "runtimeName": "적재 불가",
      "runtimePath": "Q4 4K 최소 메모리 조건 불충족",
      "safeStartingContextTokens": 4096,
      "endpoint": "http://127.0.0.1:8080",
      "gpuOffload": "적재 불가",
      "flashAttention": "적재 불가",
      "kvCacheType": "적재 불가",
      "batchSize": 1024,
      "microBatchSize": 256,
      "parallelRequests": 1,
      "parallelismSummary": "적재 불가",
      "usesAggregateMemory": false,
      "accelerationOptions": [],
      "command": null,
      "commandNotes": [],
      "estimatedPrefill": {
        "promptTokPerSecRange": "-",
        "ttftSecondsRange": "-"
      },
      "estimatedDecode": {
        "tokPerSecRange": "-"
      },
      "requiredMemoryGB": 180.53,
      "usableMemoryGB": 92,
      "remainingMemoryGB": 0,
      "speedPageUrl": "https://localai.co.kr/speed?hardware=nvidia-dual-a40-96gb&model=deepseek-v4-flash&quant=Q4_K_M&context=4096&accel=none",
      "profiles": [],
      "tuningOrder": [],
      "riskLimitations": [],
      "unsupportedReason": "DeepSeek-V4-Flash-0731 (MoE) Q4를 4K 문맥으로 적재할 때 약 180.5GB가 필요해 이 장비의 가용 메모리 92GB를 초과합니다."
    }
  ]
}
