diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..002dc0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.safetensors +*.pyc +*.log +*.jinja +tokenizer.json +tekken.json diff --git "a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/Quantize \354\247\204\355\226\211 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234.pdf" "b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/Quantize \354\247\204\355\226\211 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234.pdf" new file mode 100644 index 0000000..5b2484e Binary files /dev/null and "b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/Quantize \354\247\204\355\226\211 \352\262\260\352\263\274 \353\263\264\352\263\240\354\204\234.pdf" differ diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md new file mode 100644 index 0000000..180543e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md @@ -0,0 +1,375 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit + +> 생성일: 2026-06-17 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `mistralai/Ministral-3-3B-Instruct-2512-BF16` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| attn_impl | sdpa | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 (12 GB) | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en/c4-train.00001-of-01024.json.gz) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **10.8654** | +| 평가 소요 시간 | 1.3 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +## KMMLU 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | KMMLU (45개 과목, test) | +| Shot | 5-shot | +| 문항 수 | 35030 | +| **정확도 (micro)** | **35.58%** | +| 정확도 (macro, 과목 평균) | 35.03% | +| 평가 소요 시간 | 64.9 분 | + +
과목별 정확도 + +| 과목 | 정확도 | 문항 수 | +|---|---:|---:| +| Accounting | 37.00% | 100 | +| Agricultural-Sciences | 27.10% | 1000 | +| Aviation-Engineering-and-Maintenance | 33.60% | 1000 | +| Biology | 32.10% | 1000 | +| Chemical-Engineering | 35.60% | 1000 | +| Chemistry | 38.83% | 600 | +| Civil-Engineering | 30.50% | 1000 | +| Computer-Science | 55.90% | 1000 | +| Construction | 32.30% | 1000 | +| Criminal-Law | 28.50% | 200 | +| Ecology | 31.40% | 1000 | +| Economics | 35.38% | 130 | +| Education | 37.00% | 100 | +| Electrical-Engineering | 29.90% | 1000 | +| Electronics-Engineering | 45.50% | 1000 | +| Energy-Management | 27.20% | 1000 | +| Environmental-Science | 22.20% | 1000 | +| Fashion | 37.00% | 1000 | +| Food-Processing | 35.40% | 1000 | +| Gas-Technology-and-Engineering | 31.30% | 1000 | +| Geomatics | 33.10% | 1000 | +| Health | 37.00% | 100 | +| Industrial-Engineer | 35.70% | 1000 | +| Information-Technology | 53.70% | 1000 | +| Interior-Architecture-and-Design | 40.00% | 1000 | +| Law | 31.00% | 1000 | +| Machine-Design-and-Manufacturing | 35.00% | 1000 | +| Management | 36.80% | 1000 | +| Maritime-Engineering | 40.67% | 600 | +| Marketing | 59.90% | 1000 | +| Materials-Engineering | 35.70% | 1000 | +| Mechanical-Engineering | 28.10% | 1000 | +| Nondestructive-Testing | 38.00% | 1000 | +| Patent | 23.00% | 100 | +| Political-Science-and-Sociology | 37.67% | 300 | +| Psychology | 33.60% | 1000 | +| Public-Safety | 29.50% | 1000 | +| Railway-and-Automotive-Engineering | 29.30% | 1000 | +| Real-Estate | 36.50% | 200 | +| Refrigerating-Machinery | 29.00% | 1000 | +| Social-Welfare | 38.60% | 1000 | +| Taxation | 28.00% | 200 | +| Telecommunications-and-Wireless-Technology | 46.30% | 1000 | +| Korean-History | 33.00% | 100 | +| Math | 23.67% | 300 | + +
+ +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **50.83%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 58.75% | 80 | +| table | 56.25% | 80 | +| chart | 37.50% | 80 | + +
+ +> **K-DTCBench**: 한국어 문서·표·차트 이미지 기반 4지선다 VQA 벤치마크. vision tower는 BF16으로 유지되고 텍스트 디코더만 3-bit 양자화됨 — BF16 원본(62.08%) 대비 -11.25%p로, KMMLU(-11.30%p)와 비슷한 폭의 손실을 보인다. chart 카테고리 손실이 -15.00%p로 가장 크다. 상세 분석: `pseudo/KDTCBENCH_REPORT.md`. + +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 182 (26레이어 × 7모듈) | +| RTN 폴백 | **0 / 182** (0%) | +| 전체 평균 loss | 43.887 | +| 전체 최대 loss | 303.756 | +| 전체 최소 loss | 0.002121 | + +### 모듈별 평균 loss + +| 모듈 | 평균 loss | 최대 loss | 최소 loss | +|---|---:|---:|---:| +| `self_attn.o_proj` | 0.390 | 2.256 | 0.00212 | +| `mlp.down_proj` | 2.260 | 13.862 | 0.05200 | +| `self_attn.v_proj` | 11.270 | 42.259 | 0.11600 | +| `self_attn.k_proj` | 27.320 | 39.321 | 2.57000 | +| `self_attn.q_proj` | 74.890 | 103.728 | 4.99000 | +| `mlp.up_proj` | 85.610 | 185.965 | 11.47000 | +| `mlp.gate_proj` | 105.470 | 303.756 | 13.05000 | + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| +| 25 | `mlp.gate_proj` | 303.7563 | +| 24 | `mlp.gate_proj` | 268.1692 | +| 23 | `mlp.gate_proj` | 257.2136 | +| 22 | `mlp.gate_proj` | 218.7183 | +| 21 | `mlp.gate_proj` | 179.8194 | + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| +| 0 | 4.61 | █ | +| 1 | 10.53 | ██ | +| 2 | 16.64 | ███ | +| 3 | 24.15 | █████ | +| 4 | 27.30 | ██████ | +| 5 | 32.13 | ██████ | +| 6 | 34.82 | ███████ | +| 7 | 40.84 | ████████ | +| 8 | 37.47 | ███████ | +| 9 | 40.44 | ████████ | +| 10 | 37.58 | ███████ | +| 11 | 38.32 | ████████ | +| 12 | 33.24 | ███████ | +| 13 | 37.73 | ████████ | +| 14 | 37.43 | ███████ | +| 15 | 34.96 | ███████ | +| 16 | 42.07 | ████████ | +| 17 | 42.65 | █████████ | +| 18 | 44.42 | █████████ | +| 19 | 51.33 | ██████████ | +| 20 | 58.18 | ████████████ | +| 21 | 64.88 | █████████████ | +| 22 | 75.17 | ███████████████ | +| 23 | 86.82 | █████████████████ | +| 24 | 91.70 | ██████████████████ | +| 25 | 95.72 | ████████████████████ | + +--- + +## 양자화 심층 분석 + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 원본 선형 레이어 크기 | ~6.0 GB (3.02B params × 2 bytes) | +| 양자화 후 전체 모델 크기 | **2.7 GB** | +| 실질 압축률 (전체 모델) | ~2.8× | + +> **이론 대비 실제 차이 이유**: 3-bit으로 양자화되는 것은 선형 레이어(182개)뿐이고, +> embed_tokens·lm_head·vision tower·layer norms는 BF16으로 유지됨. +> 또한 group_size=128 오버헤드(scale + zero 파라미터)가 추가됨. + +**group_size=128 오버헤드 계산:** +``` +scale (fp16): 3.02B params / 128 × 2 bytes ≈ 47 MB +zero (int8): 3.02B params / 128 × 1 byte ≈ 24 MB +합계 ≈ 71 MB +``` + +--- + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 현재까지 누적된 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열을 양자화할 때 발생한 오차를 Hessian 역행렬을 통해 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차`(W - W_fp)`를 직접 다음 갱신에 반영 → 오차가 전파되지 않고 제자리에서 흡수됨 +- 이 실험은 `alpha=0`이므로 1차 보정(GPTAQ)은 비활성, β 항만 동작 + +--- + +### 3. loss 지표 해석 + +양자화 로그에 기록되는 loss의 정체: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 데이터의 입력 활성값 | + +**핵심**: 가중치 차이가 아니라 **실제 forward 출력의 차이**를 측정한다. +같은 오차라도 활성값(X)이 크면 loss가 크게 나온다. + +**절대 loss vs. 파라미터당 loss 비교:** + +| 모듈 | 절대 loss (최대) | 파라미터 수 | 파라미터당 loss | +|---|---:|---:|---:| +| `mlp.gate_proj` | 303.76 | 28.3M | 1.07 × 10⁻⁵ | +| `mlp.down_proj` | 13.86 | 28.3M | 4.90 × 10⁻⁷ | +| `self_attn.o_proj` | 2.26 | 12.6M | 1.79 × 10⁻⁷ | + +→ 절대 loss만 보면 gate_proj가 134× 크지만, 파라미터당으론 60× 차이로 줄어든다. +→ **절대값 숫자가 크다고 무조건 나쁜 양자화가 아님.** + +--- + +### 4. 모듈별 민감도 원인 + +**왜 gate_proj / up_proj가 높고, o_proj / down_proj가 낮은가?** + +| 모듈 | 입력 → 출력 | 방향 | 절대 loss 평균 | +|---|---|---|---:| +| `mlp.gate_proj` | 3072 → 9216 | **확장** | 105.47 | +| `mlp.up_proj` | 3072 → 9216 | **확장** | 85.61 | +| `self_attn.q_proj` | 3072 → 4096 | 확장 | 74.89 | +| `self_attn.k_proj` | 3072 → 1024 | 축소 | 27.32 | +| `self_attn.v_proj` | 3072 → 1024 | 축소 | 11.27 | +| `mlp.down_proj` | 9216 → 3072 | **축소** | 2.26 | +| `self_attn.o_proj` | 4096 → 3072 | **축소** | 0.39 | + +**구조적 이유:** +1. **출력 차원이 클수록** loss 절댓값이 크게 집계됨 (||WX - W_qX||² 의 합산 항이 많아짐) +2. **SwiGLU 구조**: gate_proj 출력이 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 +3. **축소 방향 레이어**는 입력 공간의 중요 성분을 선별적으로 압축하는 역할이라 상대적으로 양자화에 강인 + +--- + +### 5. 레이어 깊이 효과 + +레이어가 깊어질수록 loss가 급증하는 이유: + +| 구간 | 레이어 | 평균 loss | 역할 | +|---|---|---:|---| +| 초기 | 0 ~ 7 | 4.6 ~ 40.8 | 기본 어휘·문법 패턴 추출 | +| 중간 | 8 ~ 18 | 37.5 ~ 44.4 | 중간 추상화 (안정 구간) | +| 후기 | 19 ~ 25 | 51.3 ~ 95.7 | 추론·맥락 이해, 고차원 표현 | + +**이유:** +- 초기 레이어는 활성값 분포가 단순하고 Hessian이 잘 조건화(well-conditioned)되어 양자화가 쉬움 +- 후기 레이어로 갈수록 활성값의 variance가 커지고 Hessian의 고유값 분포가 넓어짐 + → 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증 +- 즉, **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다** +- 이는 3-bit이 4-bit 대비 후기 레이어에서 더 큰 품질 차이를 만드는 원인 + +--- + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** + +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 시 수치 불안정 방지용 정규화. +- 너무 작으면: Hessian이 거의 특이(singular)할 때 역행렬 계산 폭발 → RTN 폴백 발생 +- 너무 크면: Hessian 왜곡 → 최적 보상 방향 오류 → 오히려 오차 증가 +- 0.05는 업계 표준값 (0/182 RTN 폴백으로 이 실험에서 완벽히 작동) + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **표준 (이 실험)** | +| 256 | 낮음 | 보통 | 크기 우선 | +| -1 (per-column) | 최대 | 최상 | 연구용 | + +128개 가중치마다 독립적인 scale + zero 값을 가지므로, 작은 범위 내에서 최적 스케일링 가능. +숫자가 작을수록 더 세밀한 조정이 가능하지만 오버헤드가 증가한다. + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.7 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/config.json new file mode 100644 index 0000000..55081cd --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/quantize_config.json new file mode 100644 index 0000000..cd1e8ce --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/README.md new file mode 100644 index 0000000..28fe435 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3 + +> 생성일: 2026-07-08 05:05 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 8.2 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 1 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.3 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **10.7446** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **41.67%** | +| 평가 소요 시간 | 1.8 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 45.00% | 80 | +| table | 46.25% | 80 | +| chart | 33.75% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.84 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.8 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/config.json new file mode 100644 index 0000000..8f87063 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.3, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/quantize_config.json new file mode 100644 index 0000000..a45afa8 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.3, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/README.md new file mode 100644 index 0000000..0fe99fc --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6 + +> 생성일: 2026-07-08 05:17 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 8.2 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 1 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.6 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **10.6902** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **42.92%** | +| 평가 소요 시간 | 1.7 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 42.50% | 80 | +| table | 41.25% | 80 | +| chart | 45.00% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.84 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.8 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/config.json new file mode 100644 index 0000000..6ad376a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.6, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/quantize_config.json new file mode 100644 index 0000000..1e311e5 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.6, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.6/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/README.md new file mode 100644 index 0000000..4a11f74 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1 + +> 생성일: 2026-07-08 05:27 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.3 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.1 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.1 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.1) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.1) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **10.8258** | +| 평가 소요 시간 | 1.3 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **47.92%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 52.50% | 80 | +| table | 48.75% | 80 | +| chart | 42.50% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.84 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.8 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/config.json new file mode 100644 index 0000000..e7940fb --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.1, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/quantize_config.json new file mode 100644 index 0000000..f579d6a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.1, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.1/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/README.md new file mode 100644 index 0000000..84aa79a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4 + +> 생성일: 2026-07-08 05:34 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.2 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.4 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.4 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.4) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.4) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **11.0401** | +| 평가 소요 시간 | 1.3 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **49.17%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 56.25% | 80 | +| table | 46.25% | 80 | +| chart | 45.00% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.84 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.8 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/config.json new file mode 100644 index 0000000..fda0002 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.4, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/quantize_config.json new file mode 100644 index 0000000..42db574 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.4, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_beta0.4/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/README.md new file mode 100644 index 0000000..2c25341 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32 + +> 생성일: 2026-07-08 05:48 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 32 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.4 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **9.8506** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **53.33%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 61.25% | 80 | +| table | 52.50% | 80 | +| chart | 46.25% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 3.01 GB | +| 실질 압축률 | **0.0×** | +| group_size=32 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 32** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **32** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (3.0 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/config.json new file mode 100644 index 0000000..c98b71a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 32, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/quantize_config.json new file mode 100644 index 0000000..81ad547 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 32, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs32/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/README.md new file mode 100644 index 0000000..7b6b318 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64 + +> 생성일: 2026-07-08 05:56 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 64 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.3 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **10.3215** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **48.75%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 56.25% | 80 | +| table | 50.00% | 80 | +| chart | 40.00% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.90 GB | +| 실질 압축률 | **0.0×** | +| group_size=64 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 64** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **64** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.9 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/config.json new file mode 100644 index 0000000..2c5cc78 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 64, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/quantize_config.json new file mode 100644 index 0000000..763785b --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 64, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/README.md new file mode 100644 index 0000000..60ce85a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/README.md @@ -0,0 +1,231 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib + +> 생성일: 2026-07-08 04:39 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 6.0 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | wikimedia/wikipedia (20231101.ko, every 10th doc, random 1500자 crop) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **11.1077** | +| 평가 소요 시간 | 1.3 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **47.50%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 53.75% | 80 | +| table | 47.50% | 80 | +| chart | 41.25% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.84 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.8 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/config.json new file mode 100644 index 0000000..55081cd --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/quantize_config.json new file mode 100644 index 0000000..cd1e8ce --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 3, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/README.md new file mode 100644 index 0000000..6c2e9a4 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/README.md @@ -0,0 +1,232 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers + +> 생성일: 2026-07-08 06:31 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| mixed_precision | layers (4-bit) | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.3 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **9.9648** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **49.58%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 57.50% | 80 | +| table | 50.00% | 80 | +| chart | 41.25% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 2.93 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (2.9 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/config.json new file mode 100644 index 0000000..22b67d6 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/config.json @@ -0,0 +1,128 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq_v2", + "desc_act": false, + "dynamic": { + "+:model\\.language_model\\.layers\\.(20|21|22|23|24|25)\\..*": { + "bits": 4 + } + }, + "format": "gptq_v2", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/quantize_config.json new file mode 100644 index 0000000..0f43483 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/quantize_config.json @@ -0,0 +1,56 @@ +{ + "bits": 3, + "dynamic": { + "+:model\\.language_model\\.layers\\.(20|21|22|23|24|25)\\..*": { + "bits": 4 + } + }, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq_v2", + "checkpoint_format": "gptq_v2", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_layers/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/README.md new file mode 100644 index 0000000..7770e2a --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/README.md @@ -0,0 +1,232 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules + +> 생성일: 2026-07-08 06:18 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **3-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| mixed_precision | modules (4-bit) | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.2 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **9.8179** | +| 평가 소요 시간 | 1.4 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **50.83%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 62.50% | 80 | +| table | 47.50% | 80 | +| chart | 42.50% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 3-bit | +| 이론 압축률 (선형 레이어) | 16 / 3 = **5.33×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 3.03 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 3-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 3-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (3.0 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/config.json new file mode 100644 index 0000000..c48cabb --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/config.json @@ -0,0 +1,128 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 3, + "checkpoint_format": "gptq", + "desc_act": false, + "dynamic": { + "+:model\\.language_model\\.layers\\.\\d+\\.mlp\\.(gate_proj|up_proj)$": { + "bits": 4 + } + }, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/quantize_config.json new file mode 100644 index 0000000..334ad07 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/quantize_config.json @@ -0,0 +1,56 @@ +{ + "bits": 3, + "dynamic": { + "+:model\\.language_model\\.layers\\.\\d+\\.mlp\\.(gate_proj|up_proj)$": { + "bits": 4 + } + }, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/README.md new file mode 100644 index 0000000..70b17ec --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/README.md @@ -0,0 +1,220 @@ +# Ministral-3-3B-Instruct-2512-BF16_foem_4bit + +> 생성일: 2026-07-08 06:59 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88` | +| 양자화 방법 | **FOEM** | +| 비트 | **4-bit** | +| group_size | 128 | +| desc_act (act-order) | False | +| mixed_precision | none | +| attn_impl | eager | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.1 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (en, 2000자 절단) | +| 샘플 수 | 256 | +| batch_size | 4 | + +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | 0.0 | +| beta | 0.2 | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta=0.2 → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β=0.2) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: 0.2) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 + +--- + +> PPL 평가 생략 (--skip-ppl 옵션 사용) + +--- + +> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용) + +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **62.50%** | +| 평가 소요 시간 | 1.5 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 67.50% | 80 | +| table | 67.50% | 80 | +| chart | 52.50% | 80 | + +
+ +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 4-bit | +| 이론 압축률 (선형 레이어) | 16 / 4 = **4.00×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 3.22 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 4-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 4-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (3.2 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/config.json new file mode 100644 index 0000000..20608b7 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/config.json @@ -0,0 +1,123 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 4, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/processor_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/processor_config.json new file mode 100644 index 0000000..a37d728 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/processor_config.json @@ -0,0 +1,42 @@ +{ + "image_break_token": "[IMG_BREAK]", + "image_end_token": "[IMG_END]", + "image_processor": { + "crop_size": null, + "data_format": "channels_first", + "device": null, + "disable_grouping": null, + "do_center_crop": null, + "do_convert_rgb": true, + "do_normalize": true, + "do_pad": null, + "do_rescale": true, + "do_resize": true, + "image_mean": [ + 0.48145466, + 0.4578275, + 0.40821073 + ], + "image_processor_type": "PixtralImageProcessorFast", + "image_seq_length": null, + "image_std": [ + 0.26862954, + 0.26130258, + 0.27577711 + ], + "input_data_format": null, + "pad_size": null, + "patch_size": 14, + "processor_class": "PixtralProcessor", + "resample": 3, + "rescale_factor": 0.00392156862745098, + "return_tensors": null, + "size": { + "longest_edge": 1540 + } + }, + "image_token": "[IMG]", + "patch_size": 14, + "processor_class": "PixtralProcessor", + "spatial_merge_size": 2 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/quantize_config.json new file mode 100644 index 0000000..5d1cb41 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/quantize_config.json @@ -0,0 +1,51 @@ +{ + "bits": 4, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": { + "alpha": 0.0, + "beta": 0.2, + "device": "auto" + }, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/tokenizer_config.json new file mode 100644 index 0000000..dbb29c7 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit/tokenizer_config.json @@ -0,0 +1,3 @@ +{ + "tokenizer_class": "LlamaTokenizerFast" +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md new file mode 100644 index 0000000..f96965f --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md @@ -0,0 +1,274 @@ +# Ministral-3-3B-Instruct-2512-BF16_gptq_4bit + +> 생성일: 2026-06-17 09:21 + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `mistralai/Ministral-3-3B-Instruct-2512-BF16` | +| 양자화 방법 | **GPTQ** | +| 비트 | **4-bit** | +| group_size | 128 | +| attn_impl | sdpa | +| offload_to_disk | False | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | NVIDIA GeForce RTX 5070 | +| gptqmodel | 7.1.0 | +| transformers | 5.12.1 | +| torch | 2.11.0+cu128 | +| 양자화 소요 시간 | 4.7 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | allenai/c4 (폴백: wikitext-2) | +| 샘플 수 | 256 | +| batch_size | 1 | + +--- + +## 양자화 심층 분석 + +### 2. GPTQ 알고리즘 원리 + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← 기본 GPTQ 항 +``` + +- `e_i`: i번째 열 양자화 시 발생한 오차 +- `H` (Hessian = XᵀX): 활성값 기반으로 각 가중치의 중요도를 반영 +- i번째 열을 양자화할 때 발생한 오차를 Hessian 역행렬을 통해 나머지 열에 분산시켜 보상 + +--- + +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | WikiText-2 (test) | +| 시퀀스 길이 | 2048 | +| 슬라이딩 윈도우 수 | 147 | +| **PPL** | **8.7238** | +| 평가 소요 시간 | 1.3 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +--- + +## KMMLU 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | KMMLU (45개 과목, test) | +| Shot | 5-shot | +| 문항 수 | 35030 | +| **정확도 (micro)** | **44.19%** | +| 정확도 (macro, 과목 평균) | 43.42% | +| 평가 소요 시간 | 62.4 분 | + +
과목별 정확도 + +| 과목 | 정확도 | 문항 수 | +|---|---:|---:| +| Accounting | 37.00% | 100 | +| Agricultural-Sciences | 36.10% | 1000 | +| Aviation-Engineering-and-Maintenance | 41.50% | 1000 | +| Biology | 36.90% | 1000 | +| Chemical-Engineering | 47.30% | 1000 | +| Chemistry | 48.00% | 600 | +| Civil-Engineering | 41.50% | 1000 | +| Computer-Science | 69.20% | 1000 | +| Construction | 34.40% | 1000 | +| Criminal-Law | 33.50% | 200 | +| Ecology | 45.80% | 1000 | +| Economics | 46.92% | 130 | +| Education | 58.00% | 100 | +| Electrical-Engineering | 34.30% | 1000 | +| Electronics-Engineering | 52.90% | 1000 | +| Energy-Management | 33.10% | 1000 | +| Environmental-Science | 30.40% | 1000 | +| Fashion | 44.60% | 1000 | +| Food-Processing | 41.90% | 1000 | +| Gas-Technology-and-Engineering | 36.40% | 1000 | +| Geomatics | 39.80% | 1000 | +| Health | 55.00% | 100 | +| Industrial-Engineer | 40.50% | 1000 | +| Information-Technology | 64.40% | 1000 | +| Interior-Architecture-and-Design | 50.80% | 1000 | +| Law | 42.60% | 1000 | +| Machine-Design-and-Manufacturing | 42.80% | 1000 | +| Management | 49.00% | 1000 | +| Maritime-Engineering | 44.83% | 600 | +| Marketing | 74.90% | 1000 | +| Materials-Engineering | 44.80% | 1000 | +| Mechanical-Engineering | 39.40% | 1000 | +| Nondestructive-Testing | 45.40% | 1000 | +| Patent | 32.00% | 100 | +| Political-Science-and-Sociology | 47.33% | 300 | +| Psychology | 43.20% | 1000 | +| Public-Safety | 38.10% | 1000 | +| Railway-and-Automotive-Engineering | 38.60% | 1000 | +| Real-Estate | 38.50% | 200 | +| Refrigerating-Machinery | 32.70% | 1000 | +| Social-Welfare | 52.60% | 1000 | +| Taxation | 40.00% | 200 | +| Telecommunications-and-Wireless-Technology | 55.50% | 1000 | +| Korean-History | 27.00% | 100 | +| Math | 24.33% | 300 | + +
+ +--- + +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | 240 | +| **정확도 (micro=macro)** | **60.83%** | +| 평가 소요 시간 | 1.4 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +| document | 67.50% | 80 | +| table | 65.00% | 80 | +| chart | 50.00% | 80 | + +
+ +> **K-DTCBench**: 한국어 문서·표·차트 이미지 기반 4지선다 VQA 벤치마크. vision tower는 BF16으로 유지되고 텍스트 디코더만 4-bit 양자화됨 — BF16 원본(62.08%) 대비 -1.25%p로 KMMLU(-2.69%p)보다 손실이 작다. 상세 분석: `pseudo/KDTCBENCH_REPORT.md`. + +--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | 0 | +| RTN 폴백 | **0 / 0** (0%) | +| 전체 평균 loss | 0.0000 | +| 전체 최대 loss | 0.0000 | +| 전체 최소 loss | 0.000000 | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| + + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +| 레이어 | 모듈 | loss | +|---|---|---:| + + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| + + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | 4-bit | +| 이론 압축률 (선형 레이어) | 16 / 4 = **4.00×** | +| 선형 레이어 BF16 추정 크기 | 0.00 GB | +| 실제 모델 파일 크기 | 3.22 GB | +| 실질 압축률 | **0.0×** | +| group_size=128 오버헤드 | ~0 MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 4-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +| 구간 | 평균 loss | 역할 | +|---|---:|---| +| 초기 (0~0) | 0.0 | 기본 어휘·문법 패턴 추출 | +| 중간 (1~1) | 0.0 | 중간 추상화 (안정 구간) | +| 후기 (2~0) | 0.0 | 추론·맥락 이해, 고차원 표현 | + + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ 4-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = 128** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **128** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("/workspace/LLM-VLM-in-Jetson/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 (3.2 GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/config.json new file mode 100644 index 0000000..43e667c --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/config.json @@ -0,0 +1,119 @@ +{ + "architectures": [ + "Mistral3ForConditionalGeneration" + ], + "dtype": "bfloat16", + "image_token_index": 10, + "model_type": "mistral3", + "multimodal_projector_bias": false, + "projector_hidden_act": "gelu", + "quantization_config": { + "bits": 4, + "checkpoint_format": "gptq", + "desc_act": false, + "format": "gptq", + "group_size": 128, + "lm_head": false, + "meta": { + "act_group_aware": true, + "auto_forward_data_parallel": true, + "damp_auto_increment": 0.01, + "damp_percent": 0.05, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "fallback": { + "smooth": null, + "strategy": "rtn", + "threshold": "0.5%" + }, + "foem": null, + "gc_mode": "interval", + "gptaq": null, + "hessian": { + "chunk_bytes": null, + "chunk_size": null, + "staging_dtype": "float32" + }, + "mock_quantization": false, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mse": 0.0, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "quantizer": [ + "gptqmodel:7.1.0" + ], + "static_groups": false, + "true_sequential": true, + "uri": "https://github.com/modelcloud/gptqmodel", + "wait_for_submodule_finalizers": false + }, + "method": "gptq", + "pack_dtype": "int32", + "quant_method": "gptq", + "sym": true + }, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + }, + "spatial_merge_size": 2, + "text_config": { + "attention_dropout": 0.0, + "bos_token_id": 1, + "dtype": "bfloat16", + "eos_token_id": 2, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 9216, + "max_position_embeddings": 262144, + "model_type": "ministral3", + "num_attention_heads": 32, + "num_hidden_layers": 26, + "num_key_value_heads": 8, + "pad_token_id": 11, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "beta_fast": 32.0, + "beta_slow": 1.0, + "factor": 16.0, + "llama_4_scaling_beta": 0.1, + "mscale": 1.0, + "mscale_all_dim": 1.0, + "original_max_position_embeddings": 16384, + "rope_theta": 1000000.0, + "rope_type": "yarn", + "type": "yarn" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "use_cache": true, + "vocab_size": 131072 + }, + "tie_word_embeddings": true, + "transformers_version": "5.12.1", + "use_cache": false, + "vision_config": { + "attention_dropout": 0.0, + "dtype": "bfloat16", + "head_dim": 64, + "hidden_act": "silu", + "hidden_size": 1024, + "image_size": 1540, + "initializer_range": 0.02, + "intermediate_size": 4096, + "model_type": "pixtral", + "num_attention_heads": 16, + "num_channels": 3, + "num_hidden_layers": 24, + "patch_size": 14, + "rope_parameters": { + "rope_theta": 10000.0, + "rope_type": "default" + } + }, + "vision_feature_layer": -1 +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/generation_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/generation_config.json new file mode 100644 index 0000000..64b2b2e --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/generation_config.json @@ -0,0 +1,8 @@ +{ + "bos_token_id": 1, + "do_sample": true, + "eos_token_id": 2, + "max_length": 262144, + "pad_token_id": 11, + "transformers_version": "5.12.1" +} diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quant_log.csv b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quant_log.csv new file mode 100644 index 0000000..5bc4859 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quant_log.csv @@ -0,0 +1,183 @@ +layer,module,loss,samples,damp,time +0,self_attn.q_proj,0.0000050910,0.05000,1.382 +0,self_attn.k_proj,0.0000026552,0.05000,1.426 +0,self_attn.v_proj,0.0000001216,0.05000,1.612 +0,self_attn.o_proj,0.0000000020,0.05000,0.587 +0,mlp.up_proj,0.0000125129,0.05000,0.857 +0,mlp.gate_proj,0.0000142160,0.05000,0.863 +0,mlp.down_proj,0.0000000582,0.05000,1.447 +1,self_attn.v_proj,0.0000009271,0.05000,1.374 +1,self_attn.q_proj,0.0000234306,0.05000,1.379 +1,self_attn.k_proj,0.0000097041,0.05000,1.379 +1,self_attn.o_proj,0.0000000180,0.05000,0.602 +1,mlp.up_proj,0.0000186349,0.05000,0.858 +1,mlp.gate_proj,0.0000222142,0.05000,0.865 +1,mlp.down_proj,0.0000000826,0.05000,1.523 +2,self_attn.q_proj,0.0000267603,0.05000,1.401 +2,self_attn.k_proj,0.0000112801,0.05000,1.402 +2,self_attn.v_proj,0.0000015024,0.05000,1.408 +2,self_attn.o_proj,0.0000000355,0.05000,0.621 +2,mlp.gate_proj,0.0000393933,0.05000,0.931 +2,mlp.up_proj,0.0000306449,0.05000,0.937 +2,mlp.down_proj,0.0000155347,0.05000,1.587 +3,self_attn.v_proj,0.0000040551,0.05000,1.438 +3,self_attn.k_proj,0.0000198255,0.05000,1.443 +3,self_attn.q_proj,0.0000541691,0.05000,1.446 +3,self_attn.o_proj,0.0000000301,0.05000,0.570 +3,mlp.up_proj,0.0000408994,0.05000,0.853 +3,mlp.gate_proj,0.0000557422,0.05000,0.859 +3,mlp.down_proj,0.0000002740,0.05000,1.467 +4,self_attn.k_proj,0.0000190665,0.05000,1.390 +4,self_attn.q_proj,0.0000534308,0.05000,1.392 +4,self_attn.v_proj,0.0000047580,0.05000,1.394 +4,self_attn.o_proj,0.0000000792,0.05000,0.621 +4,mlp.gate_proj,0.0000672884,0.05000,0.857 +4,mlp.up_proj,0.0000498805,0.05000,0.863 +4,mlp.down_proj,0.0000004168,0.05000,1.503 +5,self_attn.q_proj,0.0000617841,0.05000,1.400 +5,self_attn.v_proj,0.0000054449,0.05000,1.405 +5,self_attn.k_proj,0.0000229042,0.05000,1.407 +5,self_attn.o_proj,0.0000001376,0.05000,0.604 +5,mlp.gate_proj,0.0000768205,0.05000,0.848 +5,mlp.up_proj,0.0000609233,0.05000,0.851 +5,mlp.down_proj,0.0000005331,0.05000,1.485 +6,self_attn.q_proj,0.0000652446,0.05000,1.441 +6,self_attn.k_proj,0.0000225443,0.05000,1.448 +6,self_attn.v_proj,0.0000070269,0.05000,1.450 +6,self_attn.o_proj,0.0000001873,0.05000,0.652 +6,mlp.gate_proj,0.0000835812,0.05000,0.833 +6,mlp.up_proj,0.0000686389,0.05000,0.836 +6,mlp.down_proj,0.0000005957,0.05000,1.467 +7,self_attn.q_proj,0.0000771717,0.05000,1.348 +7,self_attn.v_proj,0.0000076138,0.05000,1.353 +7,self_attn.k_proj,0.0000280816,0.05000,1.358 +7,self_attn.o_proj,0.0000002126,0.05000,0.604 +7,mlp.up_proj,0.0000741691,0.05000,0.879 +7,mlp.gate_proj,0.0001016431,0.05000,0.890 +7,mlp.down_proj,0.0000006280,0.05000,1.411 +8,self_attn.v_proj,0.0000071293,0.05000,1.351 +8,self_attn.k_proj,0.0000251630,0.05000,1.356 +8,self_attn.q_proj,0.0000669819,0.05000,1.358 +8,self_attn.o_proj,0.0000001895,0.05000,0.626 +8,mlp.gate_proj,0.0000914375,0.05000,0.820 +8,mlp.up_proj,0.0000739396,0.05000,0.826 +8,mlp.down_proj,0.0000005875,0.05000,1.532 +9,self_attn.q_proj,0.0000806042,0.05000,1.396 +9,self_attn.v_proj,0.0000078246,0.05000,1.400 +9,self_attn.k_proj,0.0000312775,0.05000,1.402 +9,self_attn.o_proj,0.0000002408,0.05000,0.632 +9,mlp.gate_proj,0.0000908540,0.05000,0.890 +9,mlp.up_proj,0.0000759938,0.05000,0.899 +9,mlp.down_proj,0.0000006059,0.05000,1.489 +10,self_attn.k_proj,0.0000284617,0.05000,1.381 +10,self_attn.q_proj,0.0000735121,0.05000,1.386 +10,self_attn.v_proj,0.0000070504,0.05000,1.390 +10,self_attn.o_proj,0.0000002129,0.05000,0.608 +10,mlp.up_proj,0.0000759414,0.05000,0.894 +10,mlp.gate_proj,0.0000828008,0.05000,0.900 +10,mlp.down_proj,0.0000006120,0.05000,1.468 +11,self_attn.v_proj,0.0000064106,0.05000,1.424 +11,self_attn.k_proj,0.0000370734,0.05000,1.432 +11,self_attn.q_proj,0.0000847577,0.05000,1.433 +11,self_attn.o_proj,0.0000002413,0.05000,0.643 +11,mlp.up_proj,0.0000726336,0.05000,0.842 +11,mlp.gate_proj,0.0000700734,0.05000,0.847 +11,mlp.down_proj,0.0000005705,0.05000,1.508 +12,self_attn.v_proj,0.0000066720,0.05000,1.425 +12,self_attn.k_proj,0.0000284139,0.05000,1.429 +12,self_attn.q_proj,0.0000698107,0.05000,1.433 +12,self_attn.o_proj,0.0000002328,0.05000,0.551 +12,mlp.gate_proj,0.0000621749,0.05000,0.900 +12,mlp.up_proj,0.0000665507,0.05000,0.905 +12,mlp.down_proj,0.0000005121,0.05000,1.512 +13,self_attn.q_proj,0.0000884859,0.05000,1.418 +13,self_attn.v_proj,0.0000081855,0.05000,1.424 +13,self_attn.k_proj,0.0000350578,0.05000,1.425 +13,self_attn.o_proj,0.0000002612,0.05000,0.622 +13,mlp.up_proj,0.0000696590,0.05000,0.926 +13,mlp.gate_proj,0.0000642106,0.05000,0.936 +13,mlp.down_proj,0.0000005317,0.05000,1.449 +14,self_attn.q_proj,0.0000843465,0.05000,1.398 +14,self_attn.k_proj,0.0000339952,0.05000,1.405 +14,self_attn.v_proj,0.0000086183,0.05000,1.408 +14,self_attn.o_proj,0.0000002659,0.05000,0.557 +14,mlp.up_proj,0.0000718503,0.05000,0.846 +14,mlp.gate_proj,0.0000671607,0.05000,0.850 +14,mlp.down_proj,0.0000005670,0.05000,1.465 +15,self_attn.v_proj,0.0000091670,0.05000,1.403 +15,self_attn.k_proj,0.0000261479,0.05000,1.409 +15,self_attn.q_proj,0.0000736555,0.05000,1.411 +15,self_attn.o_proj,0.0000003279,0.05000,0.553 +15,mlp.gate_proj,0.0000659288,0.05000,0.837 +15,mlp.up_proj,0.0000735419,0.05000,0.912 +15,mlp.down_proj,0.0000006474,0.05000,1.438 +16,self_attn.k_proj,0.0000347287,0.05000,1.383 +16,self_attn.q_proj,0.0001000775,0.05000,1.389 +16,self_attn.v_proj,0.0000105995,0.05000,1.394 +16,self_attn.o_proj,0.0000003771,0.05000,0.555 +16,mlp.up_proj,0.0000761852,0.05000,0.919 +16,mlp.gate_proj,0.0000764775,0.05000,0.927 +16,mlp.down_proj,0.0000008211,0.05000,1.511 +17,self_attn.v_proj,0.0000103665,0.05000,1.406 +17,self_attn.k_proj,0.0000355095,0.05000,1.413 +17,self_attn.q_proj,0.0000946844,0.05000,1.414 +17,self_attn.o_proj,0.0000003212,0.05000,0.578 +17,mlp.up_proj,0.0000800818,0.05000,0.898 +17,mlp.gate_proj,0.0000821380,0.05000,0.904 +17,mlp.down_proj,0.0000010391,0.05000,1.569 +18,self_attn.v_proj,0.0000097678,0.05000,1.420 +18,self_attn.q_proj,0.0000943511,0.05000,1.425 +18,self_attn.k_proj,0.0000329892,0.05000,1.426 +18,self_attn.o_proj,0.0000002282,0.05000,0.622 +18,mlp.up_proj,0.0000849310,0.05000,0.930 +18,mlp.gate_proj,0.0000917952,0.05000,0.935 +18,mlp.down_proj,0.0000012134,0.05000,1.534 +19,self_attn.v_proj,0.0000108003,0.05000,1.439 +19,self_attn.q_proj,0.0000980913,0.05000,1.440 +19,self_attn.k_proj,0.0000399402,0.05000,1.446 +19,self_attn.o_proj,0.0000003153,0.05000,0.558 +19,mlp.gate_proj,0.0001102005,0.05000,0.902 +19,mlp.up_proj,0.0001053227,0.05000,0.905 +19,mlp.down_proj,0.0000015849,0.05000,1.536 +20,self_attn.k_proj,0.0000361487,0.05000,1.407 +20,self_attn.q_proj,0.0001011730,0.05000,1.413 +20,self_attn.v_proj,0.0000124543,0.05000,1.415 +20,self_attn.o_proj,0.0000003721,0.05000,0.619 +20,mlp.up_proj,0.0001329280,0.05000,0.889 +20,mlp.gate_proj,0.0001323733,0.05000,0.895 +20,mlp.down_proj,0.0000024103,0.05000,1.563 +21,self_attn.v_proj,0.0000146272,0.05000,1.541 +21,self_attn.k_proj,0.0000320848,0.05000,1.542 +21,self_attn.q_proj,0.0000941369,0.05000,1.546 +21,self_attn.o_proj,0.0000003076,0.05000,0.579 +21,mlp.gate_proj,0.0001873402,0.05000,0.882 +21,mlp.up_proj,0.0001404143,0.05000,0.890 +21,mlp.down_proj,0.0000027806,0.05000,1.515 +22,self_attn.k_proj,0.0000306186,0.05000,1.455 +22,self_attn.q_proj,0.0000986363,0.05000,1.459 +22,self_attn.v_proj,0.0000207641,0.05000,1.463 +22,self_attn.o_proj,0.0000004978,0.05000,0.567 +22,mlp.gate_proj,0.0002257395,0.05000,0.878 +22,mlp.up_proj,0.0001634563,0.05000,0.885 +22,mlp.down_proj,0.0000036474,0.05000,1.509 +23,self_attn.q_proj,0.0001005777,0.05000,1.457 +23,self_attn.v_proj,0.0000379033,0.05000,1.464 +23,self_attn.k_proj,0.0000301221,0.05000,1.467 +23,self_attn.o_proj,0.0000010005,0.05000,0.643 +23,mlp.up_proj,0.0001845170,0.05000,0.851 +23,mlp.gate_proj,0.0002632820,0.05000,0.857 +23,mlp.down_proj,0.0000051748,0.05000,1.467 +24,self_attn.v_proj,0.0000431420,0.05000,1.449 +24,self_attn.q_proj,0.0001060739,0.05000,1.453 +24,self_attn.k_proj,0.0000325177,0.05000,1.456 +24,self_attn.o_proj,0.0000015279,0.05000,0.576 +24,mlp.up_proj,0.0001896525,0.05000,0.965 +24,mlp.gate_proj,0.0002733884,0.05000,0.969 +24,mlp.down_proj,0.0000083849,0.05000,1.577 +25,self_attn.q_proj,0.0001025527,0.05000,1.357 +25,self_attn.v_proj,0.0000364691,0.05000,1.367 +25,self_attn.k_proj,0.0000341554,0.05000,1.368 +25,self_attn.o_proj,0.0000019934,0.05000,0.644 +25,mlp.gate_proj,0.0003098500,0.05000,0.876 +25,mlp.up_proj,0.0001863985,0.05000,0.879 +25,mlp.down_proj,0.0000138279,0.05000,1.475 diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quantize_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quantize_config.json new file mode 100644 index 0000000..4ffe7a9 --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/quantize_config.json @@ -0,0 +1,47 @@ +{ + "bits": 4, + "group_size": 128, + "desc_act": false, + "lm_head": false, + "method": "gptq", + "quant_method": "gptq", + "format": "gptq", + "checkpoint_format": "gptq", + "pack_dtype": "int32", + "meta": { + "quantizer": [ + "gptqmodel:7.1.0" + ], + "uri": "https://github.com/modelcloud/gptqmodel", + "damp_percent": 0.05, + "damp_auto_increment": 0.01, + "static_groups": false, + "true_sequential": true, + "mse": 0.0, + "gptaq": null, + "foem": null, + "act_group_aware": true, + "fallback": { + "strategy": "rtn", + "threshold": "0.5%", + "smooth": null + }, + "offload_to_disk": false, + "offload_to_disk_path": null, + "pack_impl": "cpu", + "gc_mode": "interval", + "wait_for_submodule_finalizers": false, + "auto_forward_data_parallel": true, + "dense_vram_strategy": "exclusive", + "dense_vram_strategy_devices": null, + "moe_vram_strategy": "exclusive", + "moe_vram_strategy_devices": null, + "mock_quantization": false, + "hessian": { + "chunk_size": null, + "chunk_bytes": null, + "staging_dtype": "float32" + } + }, + "sym": true +} \ No newline at end of file diff --git a/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/tokenizer_config.json b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/tokenizer_config.json new file mode 100644 index 0000000..6f968ef --- /dev/null +++ b/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/tokenizer_config.json @@ -0,0 +1,17 @@ +{ + "add_prefix_space": null, + "backend": "tokenizers", + "bos_token": "", + "clean_up_tokenization_spaces": false, + "eos_token": "", + "is_local": true, + "legacy": true, + "local_files_only": false, + "model_max_length": 1000000000000000019884624838656, + "pad_token": "", + "processor_class": "PixtralProcessor", + "tokenizer_class": "LlamaTokenizerFast", + "unk_token": "", + "use_default_system_prompt": false, + "_commit_hash": null +} \ No newline at end of file diff --git a/README.md b/FOEM/README.md old mode 100644 new mode 100755 similarity index 100% rename from README.md rename to FOEM/README.md diff --git a/FOEM/logs/kdtcbench_predictions.json b/FOEM/logs/kdtcbench_predictions.json new file mode 100644 index 0000000..966f790 --- /dev/null +++ b/FOEM/logs/kdtcbench_predictions.json @@ -0,0 +1,12012 @@ +{ + "meta": { + "document_0": { + "question": "보고서의 주요 내용이 아닌 것은 무엇인가요?", + "choices": { + "A": "안전 인프라 확충", + "B": "재난 및 사고 예방 체계 구축", + "C": "시민 안전 교육 강화", + "D": "긴급 대응 시스템 개선" + }, + "answer": "B", + "category": "document" + }, + "document_1": { + "question": "보고서에서 알려지지 않은 정보는 무엇인가요?", + "choices": { + "A": "주소", + "B": "전화", + "C": "홈페이지", + "D": "이메일" + }, + "answer": "D", + "category": "document" + }, + "document_2": { + "question": "문서의 올바른 문서번호는 무엇인가요?", + "choices": { + "A": "TI-2023-001", + "B": "IT-2023-000", + "C": "IT-2023-001", + "D": "IT-2024-001" + }, + "answer": "C", + "category": "document" + }, + "document_3": { + "question": "문서 안 정보를 바탕으로, 해당 제안서에 참여하지 않은 인물은 누구인가요?", + "choices": { + "A": "김혁신", + "B": "오박사", + "C": "박미래", + "D": "이금융" + }, + "answer": "B", + "category": "document" + }, + "document_4": { + "question": "이용자는 평일에 도서관을 몇 시간 이용할 수 있나요?", + "choices": { + "A": "6시간", + "B": "8시간", + "C": "10시간", + "D": "12시간" + }, + "answer": "D", + "category": "document" + }, + "document_5": { + "question": "도서관 안내데스크의 전화번호 뒷자리로 올바른 것은?", + "choices": { + "A": "6426", + "B": "8513", + "C": "8836", + "D": "5678" + }, + "answer": "D", + "category": "document" + }, + "document_6": { + "question": "계약서에서 보증금은 얼마입니까?", + "choices": { + "A": "500만원", + "B": "1000만원", + "C": "1500만원", + "D": "2000만원" + }, + "answer": "A", + "category": "document" + }, + "document_7": { + "question": "계약서에서 월 임대료는 얼마입니까?", + "choices": { + "A": "50만원", + "B": "100만원", + "C": "120만원", + "D": "150만원" + }, + "answer": "C", + "category": "document" + }, + "document_8": { + "question": "여행 예약 확인서에서 호텔의 체크인 시간은 몇 시라고 표기되어 있습니까?", + "choices": { + "A": "오전 11시", + "B": "오후 1시", + "C": "오후 3시", + "D": "오후 5시" + }, + "answer": "C", + "category": "document" + }, + "document_9": { + "question": "여행 예약 확인서에서 여행의 출발일은 언제인가요?", + "choices": { + "A": "2023년 7월 15일", + "B": "2023년 7월 22일", + "C": "2023년 6월 1일", + "D": "2023년 8월 15일" + }, + "answer": "A", + "category": "document" + }, + "document_10": { + "question": "주최사 직인은 문서의 어느 부분에 있습니까?", + "choices": { + "A": "왼쪽 상단", + "B": "오른쪽 상단", + "C": "왼쪽 하단", + "D": "오른쪽 하단" + }, + "answer": "D", + "category": "document" + }, + "document_11": { + "question": "해당 문서의 내용과 비교하였을때, 옳지 않은 선택지는 무엇인가요??", + "choices": { + "A": "신년맞이 콘서트는 2023년 12월 31일 오후 8시에 개최된다.", + "B": "콘서트의 개최 장소는 서울 올림픽 공원 체조경기장이다.", + "C": "티켓의 QR코드가 첨부되어 있다.", + "D": "좌석은 VIP석 B열 15번이다." + }, + "answer": "D", + "category": "document" + }, + "document_12": { + "question": "식물 재배 일지에 표기된 식물은 어느 것입니까?", + "choices": { + "A": "스투키", + "B": "스파티필름", + "C": "몬스테라", + "D": "라벤더" + }, + "answer": "B", + "category": "document" + }, + "document_13": { + "question": "식물 재배 일지에서 다음 작업은 무엇입니까?", + "choices": { + "A": "환기시키기", + "B": "물주기", + "C": "잎 닦기", + "D": "가지치기" + }, + "answer": "A", + "category": "document" + }, + "document_14": { + "question": "환경 보호 활동 보고서에서 활동 기간은 총 몇 일로 작성되어 있나요?", + "choices": { + "A": "1일", + "B": "4일", + "C": "7일", + "D": "10일" + }, + "answer": "D", + "category": "document" + }, + "document_15": { + "question": "다음 환경 보호 활동 보고서를 참고하였을때, 환경 보호 활동의 성과로 명시되지 않은 것은 무엇인가요?", + "choices": { + "A": "한강공원 환경 개선", + "B": "시민 환경의식 향상", + "C": "길거리 문화 발전", + "D": "지역사회 환경보호 활동 확대" + }, + "answer": "C", + "category": "document" + }, + "document_16": { + "question": "환경 보고서에 표기된 조치 사항이 아닌 것은?", + "choices": { + "A": "대기 오염 저감 대책 수립", + "B": "수질 개선 프로그램 실시", + "C": "생태계 보호 구역 지정", + "D": "생태계 다양성 조사" + }, + "answer": "D", + "category": "document" + }, + "document_17": { + "question": "환경 보고서의 승인자는 누구인가요?", + "choices": { + "A": "장서연", + "B": "윤수민", + "C": "김필재", + "D": "박판순" + }, + "answer": "A", + "category": "document" + }, + "document_18": { + "question": "환경영향평가에서 표기되어 있는 평가 항목이 아닌 것은?", + "choices": { + "A": "미세먼지", + "B": "해충", + "C": "지하수", + "D": "공사 소음" + }, + "answer": "B", + "category": "document" + }, + "document_19": { + "question": "환경영향평가에서 대기에 대한 조치 사항으로 옳은 것은 무엇인가요?", + "choices": { + "A": "방음벽 설치", + "B": "살수 장치 설치", + "C": "방음벽 제거", + "D": "살수 장치 제거" + }, + "answer": "B", + "category": "document" + }, + "document_20": { + "question": "보고서에서 하천 오염도를 어떻게 예상하고 있나요?", + "choices": { + "A": "5% 상승", + "B": "5% 하락", + "C": "10% 상승", + "D": "10% 하락" + }, + "answer": "A", + "category": "document" + }, + "document_21": { + "question": "보고서에서 미세먼지 농도를 어떻게 예상하고 있나요?", + "choices": { + "A": "5% 상승", + "B": "5% 하락", + "C": "10% 상승", + "D": "10% 하락" + }, + "answer": "C", + "category": "document" + }, + "document_22": { + "question": "택배 발송 확인서에 표기되어 있는 물품명은 무엇인가요?", + "choices": { + "A": "신발", + "B": "생활용품 세트", + "C": "세탁기", + "D": "휴대폰" + }, + "answer": "B", + "category": "document" + }, + "document_23": { + "question": "택배 발송 확인서에 표기되어 있는 물품의 중량은 어떻게 되나요?", + "choices": { + "A": "1kg", + "B": "2kg", + "C": "3kg", + "D": "4kg" + }, + "answer": "C", + "category": "document" + }, + "document_24": { + "question": "서울시 공원을 이용할 수 있는 인원은 몇 명인가요?", + "choices": { + "A": "50명", + "B": "100명", + "C": "150명", + "D": "200명" + }, + "answer": "B", + "category": "document" + }, + "document_25": { + "question": "서울시 공원의 이용 시 주의사항으로 명시되지 않은 것은?", + "choices": { + "A": "공원 시설물 훼손 금지", + "B": "반려견 출입 금지", + "C": "쓰레기 분리수거 및 정리 필수", + "D": "타 이용객 방해 행위 금지" + }, + "answer": "B", + "category": "document" + }, + "document_26": { + "question": "이 프로젝트는 언제 종료되었습니까?", + "choices": { + "A": "2022.10.31", + "B": "2023.10.31", + "C": "2023.12.31", + "D": "2024.12.31" + }, + "answer": "C", + "category": "document" + }, + "document_27": { + "question": "업무 보고서의 서명자는 누구인가요?", + "choices": { + "A": "최민수", + "B": "최민혁", + "C": "김민수", + "D": "박태수" + }, + "answer": "A", + "category": "document" + }, + "document_28": { + "question": "보고서에서 대기질에 대한 대책은 무엇입니까?", + "choices": { + "A": "살수 및 먼지 저감", + "B": "오염 방지 시설 설치", + "C": "방음벽 설치", + "D": "대체 서식지 조성" + }, + "answer": "A", + "category": "document" + }, + "document_29": { + "question": "해당 보고서의 평가 항목이 아닌 것은 무엇인가요?", + "choices": { + "A": "수질", + "B": "대기질", + "C": "토양 오염도", + "D": "생태계" + }, + "answer": "C", + "category": "document" + }, + "document_30": { + "question": "결재서의 제목은 무엇입니까?", + "choices": { + "A": "농지전용 허가", + "B": "민원1회방문제도", + "C": "주택건설 부지 조성", + "D": "지적개발공제" + }, + "answer": "A", + "category": "document" + }, + "document_31": { + "question": "결재서의 내용 중 허가 면적은 어떻게 되나요?", + "choices": { + "A": "1,234㎡", + "B": "1,357㎡", + "C": "5,123㎡", + "D": "7,541㎡" + }, + "answer": "A", + "category": "document" + }, + "document_32": { + "question": "누가 서울시 공원 이용 허가증에 서명을 하였습니까?", + "choices": { + "A": "성남시장", + "B": "인천시장", + "C": "서울시장", + "D": "수원시장" + }, + "answer": "C", + "category": "document" + }, + "document_33": { + "question": "서울시 공원 이용 허가증의 이용 목적은 무엇인가요?", + "choices": { + "A": "봉사 활동", + "B": "콘서트", + "C": "투표", + "D": "야외 행사" + }, + "answer": "D", + "category": "document" + }, + "document_34": { + "question": "직원 교육 이수 확인서의 확인자는 누구인가요?", + "choices": { + "A": "홍길동", + "B": "김하은", + "C": "김철수", + "D": "이영희" + }, + "answer": "B", + "category": "document" + }, + "document_35": { + "question": "직원 교육 이수 확인서의 확인날짜는 언제입니까?", + "choices": { + "A": "2023.05.17", + "B": "2023.05.19", + "C": "2023.05.21", + "D": "2023.05.23" + }, + "answer": "D", + "category": "document" + }, + "document_36": { + "question": "김치찌개의 조리법은 몇 단계로 이루어져 있을까요?", + "choices": { + "A": "2단계", + "B": "4단계", + "C": "6단계", + "D": "8단계" + }, + "answer": "C", + "category": "document" + }, + "document_37": { + "question": "김치찌개 레시피를 바탕으로, 들어가는 재료의 종류는 총 몇개인가요?", + "choices": { + "A": "4개", + "B": "6개", + "C": "8개", + "D": "10개" + }, + "answer": "B", + "category": "document" + }, + "document_38": { + "question": "티켓에 표기된 좌석은 어디입니까?", + "choices": { + "A": "A열 17번", + "B": "A열 23번", + "C": "B열 13번", + "D": "B열 23번" + }, + "answer": "D", + "category": "document" + }, + "document_39": { + "question": "이 티켓의 이름은 무엇인가요?", + "choices": { + "A": "음악의 왕 공연 티켓", + "B": "음악의 낮 공연 티켓", + "C": "음악의 꽃 공연 티켓", + "D": "음악의 밤 공연 티켓" + }, + "answer": "D", + "category": "document" + }, + "document_40": { + "question": "회사의 1년 총 매출액은 얼마인가요?", + "choices": { + "A": "5730억원", + "B": "5920억원", + "C": "6180억원", + "D": "6330억원" + }, + "answer": "A", + "category": "document" + }, + "document_41": { + "question": "회사의 1년 총 순이익은 얼마인가요?", + "choices": { + "A": "800억원", + "B": "900억원", + "C": "1000억원", + "D": "1100억원" + }, + "answer": "B", + "category": "document" + }, + "document_42": { + "question": "이 회원은 어떤 스포츠 종목을 등록 신청하였나요?", + "choices": { + "A": "테니스", + "B": "헬스", + "C": "요가", + "D": "수영" + }, + "answer": "D", + "category": "document" + }, + "document_43": { + "question": "이 회원의 회원 유형은 무엇인가요?", + "choices": { + "A": "일반회원", + "B": "VIP회원", + "C": "없음", + "D": "없음" + }, + "answer": "B", + "category": "document" + }, + "document_44": { + "question": "이 행사는 언제 개최하나요?", + "choices": { + "A": "어린이날", + "B": "세계 환경의 날", + "C": "한글날", + "D": "개천절" + }, + "answer": "B", + "category": "document" + }, + "document_45": { + "question": "이 행사의 예산은 얼마인가요?", + "choices": { + "A": "5만원", + "B": "50만원", + "C": "500만원", + "D": "5000만원" + }, + "answer": "C", + "category": "document" + }, + "document_46": { + "question": "재활용률을 증대하기 위한 업무를 하는 부서는 무엇입니까?", + "choices": { + "A": "에너지과", + "B": "환경보호과", + "C": "자원순환과", + "D": "행정과" + }, + "answer": "C", + "category": "document" + }, + "document_47": { + "question": "환경 보호 계획 현황 문서에 있는 표의 속성이 아닌 것은?", + "choices": { + "A": "일정", + "B": "부서", + "C": "계획 내용", + "D": "진행 상황" + }, + "answer": "A", + "category": "document" + }, + "document_48": { + "question": "환자는 어떤 질병을 앓고 있나요?", + "choices": { + "A": "급성 위염", + "B": "당뇨", + "C": "고혈압", + "D": "독감" + }, + "answer": "A", + "category": "document" + }, + "document_49": { + "question": "환자는 어떤 진료과에서 진료를 받았습니까?", + "choices": { + "A": "정형외과", + "B": "산부인과", + "C": "신경과", + "D": "내과" + }, + "answer": "D", + "category": "document" + }, + "document_50": { + "question": "주간 운동 계획표에 따르면 토요일 오전에는 무슨 운동을 하나요?", + "choices": { + "A": "웨이트", + "B": "휴식", + "C": "스트레칭", + "D": "조깅" + }, + "answer": "D", + "category": "document" + }, + "document_51": { + "question": "주간 운동 계획 중 휴식을 하는 요일은 언제인가요?", + "choices": { + "A": "월요일", + "B": "수요일", + "C": "토요일", + "D": "일요일" + }, + "answer": "D", + "category": "document" + }, + "document_52": { + "question": "임대주택은 서울특별시 어느 구에 위치하나요?", + "choices": { + "A": "강동구", + "B": "용산구", + "C": "마포구", + "D": "강남구" + }, + "answer": "D", + "category": "document" + }, + "document_53": { + "question": "이 주택 임대차 계약서에서 임차인은 누구입니까?", + "choices": { + "A": "홍길동", + "B": "김철수", + "C": "이맑음", + "D": "유비빔" + }, + "answer": "B", + "category": "document" + }, + "document_54": { + "question": "여행 3일차에 진행하는 일정은 무엇인가요?", + "choices": { + "A": "올레길 트레킹", + "B": "성산일출봉 관광", + "C": "우도 여행", + "D": "제주 민속촌 방문" + }, + "answer": "A", + "category": "document" + }, + "document_55": { + "question": "여행 준비물에 해당하지 않는 물품은 무엇인가요?", + "choices": { + "A": "등산복", + "B": "여권", + "C": "오리발", + "D": "카메라" + }, + "answer": "C", + "category": "document" + }, + "document_56": { + "question": "여행하는 인원은 총 몇 명인가요?", + "choices": { + "A": "3명", + "B": "4명", + "C": "5명", + "D": "6명" + }, + "answer": "A", + "category": "document" + }, + "document_57": { + "question": "다음 여행 예약 확인서에 적힌 여행지는 어디인가요?", + "choices": { + "A": "강원도", + "B": "제주도", + "C": "전라도", + "D": "서울" + }, + "answer": "B", + "category": "document" + }, + "document_58": { + "question": "신청서에 표기된 축제 내용이 아닌 것은?", + "choices": { + "A": "지역 특산물 야시장", + "B": "별빛마을 투어", + "C": "별자리 관측 프로그램", + "D": "전통 공연 및 체험 행사" + }, + "answer": "B", + "category": "document" + }, + "document_59": { + "question": "축제가 개최되는 지역은 어디인가요?", + "choices": { + "A": "제주도", + "B": "서울", + "C": "전라도", + "D": "강원도" + }, + "answer": "D", + "category": "document" + }, + "document_60": { + "question": "급여 명세서에 표기된 연장근로수당은 얼마인가요?", + "choices": { + "A": "50,000원", + "B": "100,000원", + "C": "150,000원", + "D": "200,000원" + }, + "answer": "C", + "category": "document" + }, + "document_61": { + "question": "다음 급여 명세서에서 기본급과 연장근로수당의 합은 얼마인가요?", + "choices": { + "A": "3,000,000원", + "B": "3,100,000원", + "C": "3,150,000원", + "D": "3,200,000원" + }, + "answer": "C", + "category": "document" + }, + "document_62": { + "question": "동아리의 정기 모임은 무슨 요일에 진행하나요?", + "choices": { + "A": "목요일", + "B": "금요일", + "C": "토요일", + "D": "일요일" + }, + "answer": "B", + "category": "document" + }, + "document_63": { + "question": "동아리의 주요 활동 계획으로 해당되지 않는 활동은 무엇입니까?", + "choices": { + "A": "교내 봉사활동", + "B": "전국 동아리 연합 행사 참가", + "C": "동아리 발표회 개최", + "D": "교내 축제 부스 운영" + }, + "answer": "D", + "category": "document" + }, + "document_64": { + "question": "점검항목-상태 중 결과보고서와 일치하지 않는 것은?", + "choices": { + "A": "엔진오일-양호", + "B": "타이어-교체 필요", + "C": "브레이크-양호", + "D": "배터리-파손" + }, + "answer": "D", + "category": "document" + }, + "document_65": { + "question": "다음 표에서 비고 칸이 작성되어 있는 점검항목은 무엇인가요?", + "choices": { + "A": "엔진오일", + "B": "브레이크", + "C": "타이어", + "D": "배터리" + }, + "answer": "C", + "category": "document" + }, + "document_66": { + "question": "환경 보호 활동을 통해 수거된 쓰레기의 무게는 얼마입니까?", + "choices": { + "A": "약 180kg", + "B": "약 200kg", + "C": "약 220kg", + "D": "약 240kg" + }, + "answer": "B", + "category": "document" + }, + "document_67": { + "question": "환경 보호 활동에 참가하는 인원은 총 몇 명인가요?", + "choices": { + "A": "40명", + "B": "50명", + "C": "60명", + "D": "70명" + }, + "answer": "B", + "category": "document" + }, + "document_68": { + "question": "신청자는 어떤 동물을 입양하길 희망하나요?", + "choices": { + "A": "강아지", + "B": "고양이", + "C": "햄스터", + "D": "금붕어" + }, + "answer": "A", + "category": "document" + }, + "document_69": { + "question": "신청자가 희망하는 입양 동물의 성별은 어떻게되나요?", + "choices": { + "A": "암컷", + "B": "수컷", + "C": "없음", + "D": "없음" + }, + "answer": "A", + "category": "document" + }, + "document_70": { + "question": "환경보호 캠페인 참가로 인해 몇 시간을 봉사활동 시간으로 인정받았나요?", + "choices": { + "A": "1시간", + "B": "2시간", + "C": "3시간", + "D": "4시간" + }, + "answer": "D", + "category": "document" + }, + "document_71": { + "question": "환경보호 캠페인을 개최한 발행처는 어디입니까?", + "choices": { + "A": "통계청", + "B": "보건복지부", + "C": "지역환경보호협", + "D": "노인복지회" + }, + "answer": "C", + "category": "document" + }, + "document_72": { + "question": "김철수의 중간고사 5개 과목 평균 점수는 얼마입니까?", + "choices": { + "A": "86.8", + "B": "87.6", + "C": "91.3", + "D": "93.1" + }, + "answer": "B", + "category": "document" + }, + "document_73": { + "question": "기말고사에서 받은 5개 과목 점수 중 최솟값을 가지는 과목은?", + "choices": { + "A": "영어", + "B": "국어", + "C": "과학", + "D": "사회" + }, + "answer": "A", + "category": "document" + }, + "document_74": { + "question": "신청자는 어떤 도서를 대여 신청하였나요?", + "choices": { + "A": "생각의 지도", + "B": "마인드웨어", + "C": "무엇이 지능을 깨우는가", + "D": "인텔리전스" + }, + "answer": "A", + "category": "document" + }, + "document_75": { + "question": "신청자의 소속 부서는 어디인가요?", + "choices": { + "A": "사업팀", + "B": "기획팀", + "C": "개발팀", + "D": "마케팅팀" + }, + "answer": "D", + "category": "document" + }, + "document_76": { + "question": "수업 참관 및 담임교사와의 면담은 총 몇 시간으로 진행되나요?", + "choices": { + "A": "1시간 30분", + "B": "2시간", + "C": "2시간 30분", + "D": "3시간" + }, + "answer": "B", + "category": "document" + }, + "document_77": { + "question": "수업 참관 시 참석을 원하는 학부모는 언제까지 담임교사에게 연락을 남겨야 하나요?", + "choices": { + "A": "5월 10일", + "B": "5월 15일", + "C": "5월 20일", + "D": "5월 25일" + }, + "answer": "A", + "category": "document" + }, + "document_78": { + "question": "문서에 작성된 공지사항이 아닌 것은 무엇인가요?", + "choices": { + "A": "연말 회식 안내", + "B": "연말 성과 보고서 제출", + "C": "승진심사계획 공고", + "D": "신년 계획 수립 워크샵" + }, + "answer": "C", + "category": "document" + }, + "document_79": { + "question": "신년 계획 수립 워크샵이 진행되는 지역은 어디입니까?", + "choices": { + "A": "서울시", + "B": "제주도", + "C": "경상도", + "D": "강원도" + }, + "answer": "D", + "category": "document" + }, + "table_0": { + "question": "인프라 구축 항목의 점수는 몇 점인가요?", + "choices": { + "A": "4", + "B": "6", + "C": "8", + "D": "10" + }, + "answer": "D", + "category": "table" + }, + "table_1": { + "question": "환경 개선 항목에서 포함된 세부 항목은 무엇인가요?", + "choices": { + "A": "녹지 조성", + "B": "도로 건설", + "C": "전력 및 통신망", + "D": "도시 설계" + }, + "answer": "A", + "category": "table" + }, + "table_2": { + "question": "2019년 보안 부문의 매출액은 얼마인가요?", + "choices": { + "A": "30000억원", + "B": "32000억원", + "C": "34000억원", + "D": "36000억원" + }, + "answer": "A", + "category": "table" + }, + "table_3": { + "question": "하드웨어 부문의 구성비(전년도)는 몇 퍼센트입니까? 단, 소수점 셋째자리에서 반올림하세요.", + "choices": { + "A": "23.31%", + "B": "27.82%", + "C": "15.04%", + "D": "9.39%" + }, + "answer": "B", + "category": "table" + }, + "table_4": { + "question": "C 기업의 매출액과 성장률은 각각 얼마인가요?", + "choices": { + "A": "4120억원-22.1%", + "B": "2980억원-12.8%", + "C": "3560억원-18.5%", + "D": "3250억원-15.2%" + }, + "answer": "C", + "category": "table" + }, + "table_5": { + "question": "매출액이 가장 높은 기업은 무엇입니까?", + "choices": { + "A": "A 기업", + "B": "B 기업", + "C": "C 기업", + "D": "D 기업" + }, + "answer": "D", + "category": "table" + }, + "table_6": { + "question": "KOSDAQ의 배당 수익률은 몇 퍼센트입니까?", + "choices": { + "A": "1.5%", + "B": "2.8%", + "C": "2.3%", + "D": "1.1%" + }, + "answer": "D", + "category": "table" + }, + "table_7": { + "question": "KOSPI의 일평균 거래대금은 얼마입니까?", + "choices": { + "A": "95,000억원", + "B": "72,000억원", + "C": "169,000억원 ", + "D": "421,000억원" + }, + "answer": "A", + "category": "table" + }, + "table_8": { + "question": "2021년 특허 출원 건수는 얼마인가요?", + "choices": { + "A": "1000건", + "B": "1500건", + "C": "2000건", + "D": "2500건" + }, + "answer": "B", + "category": "table" + }, + "table_9": { + "question": "2020년과 2021년 R&D 투자액 증가분은 얼마입니까?", + "choices": { + "A": "500억원", + "B": "5000억원", + "C": "5500억원", + "D": "50000억원" + }, + "answer": "B", + "category": "table" + }, + "table_10": { + "question": "인사 평가 항목 중 가중치가 가장 높은 항목은 무엇인가요?", + "choices": { + "A": "자기 개발", + "B": "핵심 역량", + "C": "조직 기여도", + "D": "업무 성과" + }, + "answer": "D", + "category": "table" + }, + "table_11": { + "question": "자기 개발 항목의 가중치는 몇 퍼센트입니까?", + "choices": { + "A": "10%", + "B": "20%", + "C": "30%", + "D": "40%" + }, + "answer": "B", + "category": "table" + }, + "table_12": { + "question": "주거지역의 행정구역에 포함되지 않는 것은?", + "choices": { + "A": "학교", + "B": "상가", + "C": "공원", + "D": "아파트단지" + }, + "answer": "B", + "category": "table" + }, + "table_13": { + "question": "공업지역의 인구 비율은 얼마입니까?", + "choices": { + "A": "5.0%", + "B": "16.7%", + "C": "20.0%", + "D": "58.3%" + }, + "answer": "A", + "category": "table" + }, + "table_14": { + "question": "온라인 쇼핑몰에서 배송 속도의 만족도는 몇 점인가요?", + "choices": { + "A": "4.5", + "B": "3.9", + "C": "4.1", + "D": "3.8" + }, + "answer": "A", + "category": "table" + }, + "table_15": { + "question": "오프라인 매장에서 웹사이트 사용의 만족도는 몇점인가요?", + "choices": { + "A": "3.8", + "B": "4.1", + "C": "4.3", + "D": "4.6" + }, + "answer": "A", + "category": "table" + }, + "table_16": { + "question": "대학원 진학률이 가장 높은 학과는 어디입니까?", + "choices": { + "A": "화학공학과", + "B": "컴퓨터공학과", + "C": "기계공학과", + "D": "경역학과" + }, + "answer": "B", + "category": "table" + }, + "table_17": { + "question": "취업률이 가장 높은 학과는 무엇입니까?", + "choices": { + "A": "경영학과", + "B": "컴퓨터 공학과", + "C": "기계 공학과", + "D": "화학 공학과" + }, + "answer": "B", + "category": "table" + }, + "table_18": { + "question": "2021년 10월의 KOSPI 지수는 얼마입니까?", + "choices": { + "A": "2976.21", + "B": "3068.82", + "C": "2970.68", + "D": "3203.92" + }, + "answer": "C", + "category": "table" + }, + "table_19": { + "question": "2021년 9월 KOSPI 등락률은 몇 퍼센트입니까?", + "choices": { + "A": "-2.9%", + "B": "-4.1%", + "C": "-3.2%", + "D": "1.8%" + }, + "answer": "B", + "category": "table" + }, + "table_20": { + "question": "수시전형의 불합격자 수는 몇 명입니까?", + "choices": { + "A": "15000명", + "B": "8000명", + "C": "1600명", + "D": "12000명" + }, + "answer": "D", + "category": "table" + }, + "table_21": { + "question": "전체 전형 중 불합격자의 비율은 몇 퍼센트입니까?", + "choices": { + "A": "20%", + "B": "80%", + "C": "40%", + "D": "60%" + }, + "answer": "B", + "category": "table" + }, + "table_22": { + "question": "대학생들이 진로를 선택한 가장 큰 이유는 무엇인가요?", + "choices": { + "A": "부모님 권유", + "B": "적성과 흥미", + "C": "연봉", + "D": "취업 전망" + }, + "answer": "B", + "category": "table" + }, + "table_23": { + "question": "부모님 권유와 사회적 인정을 이유로 진로를 선택한 학생 수는 모두 몇 명입니까?", + "choices": { + "A": "110명", + "B": "150명", + "C": "70명", + "D": "40명" + }, + "answer": "A", + "category": "table" + }, + "table_24": { + "question": "인천에서 자전거 이용률은 몇 퍼센트입니까?", + "choices": { + "A": "10.2%", + "B": "11.4%", + "C": "42.1%", + "D": "39.8%" + }, + "answer": "B", + "category": "table" + }, + "table_25": { + "question": "서울에서 가장 많이 이용되는 교통 수단은 무엇입니까?", + "choices": { + "A": "자전거", + "B": "지하철", + "C": "버스", + "D": "자가용" + }, + "answer": "C", + "category": "table" + }, + "table_26": { + "question": "대중교통 이용률이 두 번째로 높은 해는 언제 입니까?", + "choices": { + "A": "2018년", + "B": "2021년", + "C": "2020년", + "D": "2019년" + }, + "answer": "D", + "category": "table" + }, + "table_27": { + "question": "2021년에 자가용 이용률은 몇 퍼센트입니까?", + "choices": { + "A": "65%", + "B": "64%", + "C": "70%", + "D": "72%" + }, + "answer": "D", + "category": "table" + }, + "table_28": { + "question": "데이터 관리는 어떤 방식으로 이루어집니까?", + "choices": { + "A": "MS Office 저장소", + "B": "AutoCAD 저장소", + "C": "ProjectWise 클라우드 저장소", + "D": "모바일 앱 저장소" + }, + "answer": "C", + "category": "table" + }, + "table_29": { + "question": "건설 프로젝트 관리 시스템에서 사용하지 않는 도구는 무엇입니까?", + "choices": { + "A": "ProjectWise", + "B": "AutoCAD", + "C": "Excel", + "D": "Revit 클라우드 저장소" + }, + "answer": "C", + "category": "table" + }, + "table_30": { + "question": "2009년 산업 부문의 에너지 소비량은 몇 백만 TOE입니까?", + "choices": { + "A": "57.2", + "B": "56.8", + "C": "59.8", + "D": "58.4" + }, + "answer": "A", + "category": "table" + }, + "table_31": { + "question": "2010년 가정 부문의 에너지 소비량은 몇 백만 TOE입니까?", + "choices": { + "A": "21.1", + "B": "19.7", + "C": "19.9", + "D": "20.7" + }, + "answer": "B", + "category": "table" + }, + "table_32": { + "question": "2012년의 최고 기온은 얼마입니까?", + "choices": { + "A": "18.0°C", + "B": "18.2°C", + "C": "17.4°C", + "D": "17.6°C" + }, + "answer": "D", + "category": "table" + }, + "table_33": { + "question": "2012년의 평균 기온은 얼마입니까?", + "choices": { + "A": "12.9°C", + "B": "12.5°C", + "C": "12.3°C", + "D": "13.1°C" + }, + "answer": "C", + "category": "table" + }, + "table_34": { + "question": "대구 광역시의 스마트시티 계획은 어느 구역을 대상으로 하고 있습니까?", + "choices": { + "A": "유성구", + "B": "중구", + "C": "북구", + "D": "광산구" + }, + "answer": "C", + "category": "table" + }, + "table_35": { + "question": "광주광역시의 스마트시티 계획의 주요 특징은 무엇입니까?", + "choices": { + "A": "AI 기반 도시 서비스", + "B": "R&D 중심 스마트시티", + "C": "해양 IoT 기반 스마트 항만", + "D": "노후 도심 스마트화" + }, + "answer": "A", + "category": "table" + }, + "table_36": { + "question": "영남권의 고용보험 가입자 지역별 비중은 몇 퍼센트입니까?", + "choices": { + "A": "27.4%", + "B": "65.0%", + "C": "15.5%", + "D": "37.1%" + }, + "answer": "A", + "category": "table" + }, + "table_37": { + "question": "호남권의 근로자의 지역별 비중은 몇 퍼센트입니까?", + "choices": { + "A": "15.9%", + "B": "20.5%", + "C": "27.3%", + "D": "36.4%" + }, + "answer": "A", + "category": "table" + }, + "table_38": { + "question": "사립학교법에서 학교법인과 교원임용에 관한 벌칙은 몇 조에 나와 있습니까?", + "choices": { + "A": "제3조", + "B": "제55조", + "C": "제20조", + "D": "제39조" + }, + "answer": "B", + "category": "table" + }, + "table_39": { + "question": "초중등교육법의 주요내용은 몇 조에 기술되어 있습니까?", + "choices": { + "A": "제39조", + "B": "제60조", + "C": "제55조", + "D": "제23조" + }, + "answer": "D", + "category": "table" + }, + "table_40": { + "question": "전체적으로 \"매우 그렇다\"고 응답한 비율이 가장 낮은 항목은 무엇인가요?", + "choices": { + "A": "업무환경", + "B": "의사소통문제", + "C": "업무과중", + "D": "모두 동일하다" + }, + "answer": "A", + "category": "table" + }, + "table_41": { + "question": "업무 환경에 대한 설문에서 평균 점수는 몇 점입니까?", + "choices": { + "A": "3.05점", + "B": "2.86점", + "C": "2.66점", + "D": "2.5점" + }, + "answer": "B", + "category": "table" + }, + "table_42": { + "question": "2023년 지하철 요금은 1993년 지하철 요금의 몇 배인가요?", + "choices": { + "A": "1배", + "B": "2배", + "C": "3배", + "D": "4배" + }, + "answer": "C", + "category": "table" + }, + "table_43": { + "question": "2023년 시내버스 요금은 얼마입니까?", + "choices": { + "A": "850원", + "B": "1000원", + "C": "1200원", + "D": "1300원" + }, + "answer": "D", + "category": "table" + }, + "table_44": { + "question": "가장 낮은 비율을 차지하는 전형 방법은 무엇인가요?", + "choices": { + "A": "정시수능", + "B": "수시학생부교과", + "C": "수시논술", + "D": "기타" + }, + "answer": "D", + "category": "table" + }, + "table_45": { + "question": "대학 입학 전형 방법 중 가장 높은 비율을 차지하는 것은 무엇입니까?", + "choices": { + "A": "수시 학생부종합", + "B": "정시수능", + "C": "수시 논술", + "D": "정시실기" + }, + "answer": "B", + "category": "table" + }, + "table_46": { + "question": "2021년에 반도체 수출액은 얼마인가요?", + "choices": { + "A": "99.18십억 달러", + "B": "127.98십억 달러", + "C": "55.39십억 달러", + "D": "66.18십억 달러" + }, + "answer": "B", + "category": "table" + }, + "table_47": { + "question": "2015년에 수출액이 가장 적은 산업은 무엇인가요?", + "choices": { + "A": "자동차", + "B": "조선", + "C": "석유화학", + "D": "디스플레이" + }, + "answer": "D", + "category": "table" + }, + "table_48": { + "question": "인구 성장률이 가장 높은 해는 언제인가요?", + "choices": { + "A": "2010년", + "B": "2013년", + "C": "2017년", + "D": "2020년" + }, + "answer": "D", + "category": "table" + }, + "table_49": { + "question": "2013년 출생아 수는 몇 명입니까?", + "choices": { + "A": "436천명", + "B": "435천명", + "C": "438천명", + "D": "358천명" + }, + "answer": "A", + "category": "table" + }, + "table_50": { + "question": "연간 소득이 1천만 원 이하인 경우 소득세율은 몇 퍼센트인가요?", + "choices": { + "A": "6%", + "B": "15%", + "C": "24%", + "D": "35%" + }, + "answer": "A", + "category": "table" + }, + "table_51": { + "question": "연간 소득 4천만원에서 8천만원 구간의 소득세율은 몇 퍼센트입니까?", + "choices": { + "A": "6%", + "B": "15%", + "C": "24%", + "D": "35%" + }, + "answer": "C", + "category": "table" + }, + "table_52": { + "question": "북미에서 주요 관광지로 언급된 장소는 어디인가요?", + "choices": { + "A": "만리장성", + "B": "나이아가라 폭포", + "C": "후지산", + "D": "산토리니" + }, + "answer": "B", + "category": "table" + }, + "table_53": { + "question": "유럽의 주요 관광 시즌은 언제입니까?", + "choices": { + "A": "봄", + "B": "여름", + "C": "가을", + "D": "겨울" + }, + "answer": "B", + "category": "table" + }, + "table_54": { + "question": "소프트웨어 부문의 영업이익은 얼마인가요?", + "choices": { + "A": "8,541억 원", + "B": "3,207억 원", + "C": "3,005억 원", + "D": "2,329억 원" + }, + "answer": "B", + "category": "table" + }, + "table_55": { + "question": "표에서 클라우드 부문의 기업 수는 몇 개입니까?", + "choices": { + "A": "5", + "B": "7", + "C": "9", + "D": "11" + }, + "answer": "A", + "category": "table" + }, + "table_56": { + "question": "기업 B의 인재육성 전략은 무엇인가요?", + "choices": { + "A": "전문인력 양성 프로그램", + "B": "오픈이노베이션 전략", + "C": "해외 인재 유치", + "D": "사내 벤처 프로그램" + }, + "answer": "D", + "category": "table" + }, + "table_57": { + "question": "기업 B의 인프라 구축 전략에는 무엇이 포함되어 있습니까?", + "choices": { + "A": "최신 연구시설 확충", + "B": "클라우드 시스템 도입", + "C": "빅데이터 센터 구축", + "D": "글로벌 파트너십 구축" + }, + "answer": "C", + "category": "table" + }, + "table_58": { + "question": "2020년에 태양광과 풍력 발전량의 합계는 몇 TWh인가요?", + "choices": { + "A": "8.0TWh", + "B": "7.8TWh", + "C": "6.4TWh", + "D": "4.8Twh" + }, + "answer": "A", + "category": "table" + }, + "table_59": { + "question": "2021년 이후 바이오매스 발전량은 얼마인가요?", + "choices": { + "A": "6.2TWh", + "B": "3.2TWh", + "C": "9.1TWh", + "D": "13.1TWh" + }, + "answer": "C", + "category": "table" + }, + "table_60": { + "question": "중소기업 지원 프로그램 개수가 가장 많은 해는 언제인가요?", + "choices": { + "A": "2015년", + "B": "2017년", + "C": "2019년", + "D": "2020년" + }, + "answer": "D", + "category": "table" + }, + "table_61": { + "question": "2017년에 중소기업 지원 프로그램에 참여한 기업 수는 몇 개입니까?", + "choices": { + "A": "850개", + "B": "920개", + "C": "1050개", + "D": "1180개" + }, + "answer": "C", + "category": "table" + }, + "table_62": { + "question": "대기환경보전법이 제정된 연도는 언제인가요?", + "choices": { + "A": "2007년", + "B": "1986년", + "C": "1990년", + "D": "1995년" + }, + "answer": "C", + "category": "table" + }, + "table_63": { + "question": "1995년에 제정된 환경 관련 법은 무엇입니까?", + "choices": { + "A": "수질 및 수생태계 보전에 관한 법률", + "B": "폐기물관리법", + "C": "대기환경보전법", + "D": "토양환경보전법" + }, + "answer": "D", + "category": "table" + }, + "table_64": { + "question": "임대료 지수가 가장 높은 도시는 어디인가요?", + "choices": { + "A": "서울", + "B": "파리", + "C": "뉴욕", + "D": "런던" + }, + "answer": "C", + "category": "table" + }, + "table_65": { + "question": "도쿄의 임대료 지수는 얼마입니까?", + "choices": { + "A": "33", + "B": "45", + "C": "46", + "D": "87" + }, + "answer": "C", + "category": "table" + }, + "table_66": { + "question": "연간 변동률이 음수인 시장은 몇 개인가요?", + "choices": { + "A": "1개", + "B": "2개", + "C": "3개", + "D": "4개" + }, + "answer": "B", + "category": "table" + }, + "table_67": { + "question": "일간 변동률이 가장 높은 지수는 무엇입니까?", + "choices": { + "A": "KOSPI", + "B": "Nikkei 225", + "C": "Shanghai Composite", + "D": "Hang Seng" + }, + "answer": "A", + "category": "table" + }, + "table_68": { + "question": "국제 학술 컨퍼런스 지원 프로그램을 주관하는 기관은 어디인가요?", + "choices": { + "A": "교육부", + "B": "과학기술정보통신부", + "C": "한국연구재단", + "D": "정답 없음" + }, + "answer": "A", + "category": "table" + }, + "table_69": { + "question": "국제 학술 교류 프로그램 중 \"글로벌 연구자 교류 프로그램\"의 주관 기관은 어디입니까?", + "choices": { + "A": "교육부", + "B": "한국연구재단", + "C": "과학기술정보통신부", + "D": "외교부" + }, + "answer": "B", + "category": "table" + }, + "table_70": { + "question": "2021년의 이혼 건수는 몇 건이었나요?", + "choices": { + "A": "192507건", + "B": "213502건", + "C": "106565건", + "D": "102000건" + }, + "answer": "D", + "category": "table" + }, + "table_71": { + "question": "2020년 대한민국의 합계 출생률은 얼마입니까?", + "choices": { + "A": "0.84", + "B": "0.81", + "C": "0.92", + "D": "0.98" + }, + "answer": "A", + "category": "table" + }, + "table_72": { + "question": "서울의 관광 수입은 얼마인가요?", + "choices": { + "A": "3조 2,000억원", + "B": "2조 8,500억원", + "C": "1조 9,800억원", + "D": "3조 5,000억원" + }, + "answer": "B", + "category": "table" + }, + "table_73": { + "question": "제주도의 연간 방문객 수는 몇 명입니까?", + "choices": { + "A": "980만명", + "B": "1,450만명", + "C": "1,320만명", + "D": "2,000만명" + }, + "answer": "B", + "category": "table" + }, + "table_74": { + "question": "도시 재개발 프로젝트에서 \"보상협의 시작\"이 이루어진 날짜는 언제인가요?", + "choices": { + "A": "21.06.10", + "B": "21.09.20", + "C": "22.01.15", + "D": "22.05.30" + }, + "answer": "C", + "category": "table" + }, + "table_75": { + "question": "2021년 2월 28일에 어떤 단계가 추진되나요?", + "choices": { + "A": "기본계획 수립", + "B": "도시계획위원회 심의", + "C": "보상계획 공고", + "D": "철거 공사 착수" + }, + "answer": "B", + "category": "table" + }, + "table_76": { + "question": "잔금이 증가한 이유는 무엇인가요?", + "choices": { + "A": "중개 수수료율 상승", + "B": "물가 상승 반영", + "C": "서류 추가 발생", + "D": "정답 없음" + }, + "answer": "B", + "category": "table" + }, + "table_77": { + "question": "부동산 중개수수료의 실제 비용은 예상 비용과 얼마나 차이가 나나요?", + "choices": { + "A": "200,000원", + "B": "300,000원", + "C": "500,000원", + "D": "100,000원" + }, + "answer": "A", + "category": "table" + }, + "table_78": { + "question": "농업이 GDP에서 차지하는 비중이 가장 높은 나라는 어디인가요?", + "choices": { + "A": "한국", + "B": "중국", + "C": "독일", + "D": "영국" + }, + "answer": "B", + "category": "table" + }, + "table_79": { + "question": "서비스업이 GDP에서 차지하는 비중이 두 번쨰로 낮은 나라는 어디인가요?", + "choices": { + "A": "한국", + "B": "미국", + "C": "독일", + "D": "영국" + }, + "answer": "A", + "category": "table" + }, + "chart_0": { + "question": "직장인들이 퇴근 후 두 번째로 선호하는 활동은 무엇인가요?", + "choices": { + "A": "운동", + "B": "여가활동", + "C": "자기개발", + "D": "휴식" + }, + "answer": "D", + "category": "chart" + }, + "chart_1": { + "question": "직장인들이 퇴근 후 가장 선호하지 않는 활동은 무엇인가요?", + "choices": { + "A": "가사", + "B": "여가활동", + "C": "자기개발", + "D": "휴식" + }, + "answer": "A", + "category": "chart" + }, + "chart_2": { + "question": "30대에서 스마트폰 사용 시간이 증가하지 않았다고 응답한 비율은 몇 퍼센트인가요?", + "choices": { + "A": "45.3%", + "B": "37.7%", + "C": "31.1%", + "D": "24.8%" + }, + "answer": "B", + "category": "chart" + }, + "chart_3": { + "question": "스마트폰 사용 시간이 증가한 비율이 가장 높은 세대는 어디인가요?", + "choices": { + "A": "10대", + "B": "20대", + "C": "30대", + "D": "40대" + }, + "answer": "A", + "category": "chart" + }, + "chart_4": { + "question": "전기차 판매량이 가장 많이 증가한 해는 언제인가요?", + "choices": { + "A": "2018년에서 2019년", + "B": "2019년에서 2020년", + "C": "모두 동일하다", + "D": "알 수 없다" + }, + "answer": "B", + "category": "chart" + }, + "chart_5": { + "question": "2019년 충전소 설치 수는 몇 개인가요?", + "choices": { + "A": "100개", + "B": "300개", + "C": "500개", + "D": "800개" + }, + "answer": "B", + "category": "chart" + }, + "chart_6": { + "question": "2015년 이후로 자동차 생산량이 감소한 나라는 어디인가요?", + "choices": { + "A": "일본", + "B": "한국", + "C": "중국", + "D": "모두 증가했다" + }, + "answer": "A", + "category": "chart" + }, + "chart_7": { + "question": "2005년에 가장 낮은 자동차 생산량을 기록한 나라는 어디입니까?", + "choices": { + "A": "일본", + "B": "한국", + "C": "중국", + "D": "없음" + }, + "answer": "A", + "category": "chart" + }, + "chart_8": { + "question": "온라인 쇼핑으로 인해 오프라인 매장 방문이 감소했다고 응답한 사람들은 몇 퍼센트인가요?", + "choices": { + "A": "45.2%", + "B": "62.3%", + "C": "76.0%", + "D": "84.7%" + }, + "answer": "C", + "category": "chart" + }, + "chart_9": { + "question": "오프라인 매장 방문에 변화가 없다고 응답한 비율은 몇 퍼센트인가요?", + "choices": { + "A": "5.5%", + "B": "18.5%", + "C": "30.8%", + "D": "45.2%" + }, + "answer": "B", + "category": "chart" + }, + "chart_10": { + "question": "2022년에 대기업의 매출액은 얼마였나요?", + "choices": { + "A": "9000억원", + "B": "1조 3000억원", + "C": "1조 7000억원", + "D": "2조 1000억원" + }, + "answer": "D", + "category": "chart" + }, + "chart_11": { + "question": "2020년과 2022년 중소기업의 매출액 차이는 얼마인가요?", + "choices": { + "A": "1000억원", + "B": "2000억 원", + "C": "3000억 원", + "D": "4000억 원" + }, + "answer": "B", + "category": "chart" + }, + "chart_12": { + "question": "2010년에 비해 2015년의 온라인 쇼핑 이용률은 몇 퍼센트 증가했나요?", + "choices": { + "A": "11.4%", + "B": "13.2%", + "C": "15.1%", + "D": "17.9%" + }, + "answer": "B", + "category": "chart" + }, + "chart_13": { + "question": "2015년 한국의 온라인 쇼핑 이용률은 몇 퍼센트였나요?", + "choices": { + "A": "45.6%", + "B": "52.3%", + "C": "65.5%", + "D": "75.8%" + }, + "answer": "C", + "category": "chart" + }, + "chart_14": { + "question": "대학 입학 경쟁률이 가장 높았던 해는 언제인가요?", + "choices": { + "A": "2007년", + "B": "2010년", + "C": "2017년", + "D": "2020년" + }, + "answer": "A", + "category": "chart" + }, + "chart_15": { + "question": "시간이 지날수록 한국대학 입학 경쟁률은 어떻게 변하고 있나요?", + "choices": { + "A": "계속 증가한다.", + "B": "계속 감소한다.", + "C": "증가하다가 감소한다.", + "D": "감소하다가 증가한다." + }, + "answer": "B", + "category": "chart" + }, + "chart_16": { + "question": "2018년에 대중교통 이용률은 몇 퍼센트였나요?", + "choices": { + "A": "62.5%", + "B": "65.0%", + "C": "68.1%", + "D": "71.9%" + }, + "answer": "C", + "category": "chart" + }, + "chart_17": { + "question": "2020년에 대중교통 이용률은 몇 퍼센트였나요?", + "choices": { + "A": "65.3%", + "B": "68.1%", + "C": "70.7%", + "D": "55.8%" + }, + "answer": "D", + "category": "chart" + }, + "chart_18": { + "question": "2023년 60세 이상 노인의 여가 활동 중 여행의 비율은 몇 퍼센트인가요?", + "choices": { + "A": "20.6%", + "B": "25.3%", + "C": "30.1%", + "D": "35.7%" + }, + "answer": "B", + "category": "chart" + }, + "chart_19": { + "question": "2023년 60세 이상 노인의 여가 활동 중 두 번째로 높은 비율을 차지한 것은 무엇인가요?", + "choices": { + "A": "운동", + "B": "여행", + "C": "문화활동", + "D": "기타" + }, + "answer": "B", + "category": "chart" + }, + "chart_20": { + "question": "2021년 30대~50대 인구 비율이 가장 많은 도시는 어디인가요?", + "choices": { + "A": "대구", + "B": "인천", + "C": "서울", + "D": "부산" + }, + "answer": "C", + "category": "chart" + }, + "chart_21": { + "question": "2021년 부산에서 30대 미만의 비율은 몇 퍼센트인가요?", + "choices": { + "A": "24.1%", + "B": "23.4%", + "C": "33.5%", + "D": "32.5%" + }, + "answer": "A", + "category": "chart" + }, + "chart_22": { + "question": "9급 공무원의 평균 연봉은 2급 공무원의 평균 연봉과 비교했을 때 얼마나 낮나요?", + "choices": { + "A": "7000만원", + "B": "6500만원", + "C": "6000만원", + "D": "5500만원" + }, + "answer": "B", + "category": "chart" + }, + "chart_23": { + "question": "2023년 1급 공무원의 평균 연봉은 얼마인가요?", + "choices": { + "A": "1억 2천만원", + "B": "1억 5백만원", + "C": "8천만원", + "D": "7천만원" + }, + "answer": "A", + "category": "chart" + }, + "chart_24": { + "question": "2020년 사회복지 예산은 얼마인가요?", + "choices": { + "A": "43.2조원", + "B": "46.7조원", + "C": "51.9조원", + "D": "58.3조원" + }, + "answer": "C", + "category": "chart" + }, + "chart_25": { + "question": "2018년과 2021년 사회복지 예산의 차이는 몇 조 원인가요?", + "choices": { + "A": "10.1조 원", + "B": "16.0조 원", + "C": "15.1조 원", + "D": "13.5조 원" + }, + "answer": "C", + "category": "chart" + }, + "chart_26": { + "question": "35-44세 연령대에서 인스타그램 사용률은 몇 퍼센트인가요?", + "choices": { + "A": "65%", + "B": "60%", + "C": "55%", + "D": "50%" + }, + "answer": "D", + "category": "chart" + }, + "chart_27": { + "question": "15-24세 연령대에서 가장 많이 사용하는 SNS 플랫폼은 무엇인가요?", + "choices": { + "A": "페이스북", + "B": "인스타그램", + "C": "트위터", + "D": "틱톡" + }, + "answer": "B", + "category": "chart" + }, + "chart_28": { + "question": "2018년 단독주택 건설 수는 몇 호인가요?", + "choices": { + "A": "13000호", + "B": "15000호", + "C": "17000호", + "D": "18000호" + }, + "answer": "B", + "category": "chart" + }, + "chart_29": { + "question": "2019년 서울시에서 아파트 건설 실적은 몇 호인가요?", + "choices": { + "A": "55000호", + "B": "58000호", + "C": "62000호", + "D": "17000호" + }, + "answer": "B", + "category": "chart" + }, + "chart_30": { + "question": "2023년에 30대가 가장 선호하는 운동은 무엇인가요?", + "choices": { + "A": "유산소", + "B": "요가", + "C": "수영", + "D": "웨이트" + }, + "answer": "D", + "category": "chart" + }, + "chart_31": { + "question": "2023년에 50대 이상에서 수영을 선호하는 비율은 몇 퍼센트인가요?", + "choices": { + "A": "15%", + "B": "25%", + "C": "30%", + "D": "10%" + }, + "answer": "C", + "category": "chart" + }, + "chart_32": { + "question": "60대 이상의 주말 독서율은 몇 퍼센트인가요?", + "choices": { + "A": "25%", + "B": "30%", + "C": "35%", + "D": "40%" + }, + "answer": "C", + "category": "chart" + }, + "chart_33": { + "question": "주말 독서율이 가장 높은 연령대는 무엇인가요?", + "choices": { + "A": "10대", + "B": "20대", + "C": "30대", + "D": "40대" + }, + "answer": "A", + "category": "chart" + }, + "chart_34": { + "question": "2019년 강남구와 강북구의 전기차 충전소 설치 수 차이는 몇 개인가요?", + "choices": { + "A": "20개", + "B": "40개", + "C": "60개", + "D": "80개" + }, + "answer": "A", + "category": "chart" + }, + "chart_35": { + "question": "2021년 강남구의 전기차 충전소 설치 수는 몇 개인가요?", + "choices": { + "A": "150개", + "B": "200개", + "C": "80개", + "D": "120개" + }, + "answer": "B", + "category": "chart" + }, + "chart_36": { + "question": "스마트폰이 업무에 사용된 비율이 가장 낮은 분기는 언제인가요?", + "choices": { + "A": "1분기", + "B": "2분기", + "C": "3분기", + "D": "4분기" + }, + "answer": "D", + "category": "chart" + }, + "chart_37": { + "question": "2023년 3분기의 스마트폰 사용 시간 중 업무가 차지하는 비율은 몇 퍼센트인가요?", + "choices": { + "A": "25%", + "B": "35%", + "C": "40%", + "D": "45%" + }, + "answer": "A", + "category": "chart" + }, + "chart_38": { + "question": "2024년에는 IoT 활용이 얼마나 증가할 것으로 보이나요?", + "choices": { + "A": "1.3%", + "B": "2.6%", + "C": "3.1%", + "D": "4.5%" + }, + "answer": "B", + "category": "chart" + }, + "chart_39": { + "question": "2024년 디지털 전환(DX) 분야 중 빅데이터 분석의 추진 비율은 몇 퍼센트로 예상되나요?", + "choices": { + "A": "15.2%", + "B": "22.1%", + "C": "18.7%", + "D": "16.5%" + }, + "answer": "C", + "category": "chart" + }, + "chart_40": { + "question": "20대가 가장 선호하는 운동은 무엇인가요?", + "choices": { + "A": "달리기", + "B": "자전거", + "C": "수영", + "D": "헬스" + }, + "answer": "A", + "category": "chart" + }, + "chart_41": { + "question": "30대와 40대에서 수영을 선호하는 비율은 몇 퍼센트 차이가 나나요?", + "choices": { + "A": "5%", + "B": "10%", + "C": "15%", + "D": "20%" + }, + "answer": "B", + "category": "chart" + }, + "chart_42": { + "question": "남성과 여성 관광객 비율이 가장 차이가 많이 나는 계절은 무엇입니까?", + "choices": { + "A": "봄", + "B": "여름", + "C": "가을", + "D": "겨울" + }, + "answer": "D", + "category": "chart" + }, + "chart_43": { + "question": "2023년 겨울철 관광객 중 여성의 비율은 몇 퍼센트인가요?", + "choices": { + "A": "64.8%", + "B": "57.2%", + "C": "69.5%", + "D": "61.4%" + }, + "answer": "C", + "category": "chart" + }, + "chart_44": { + "question": "2020년과 2021년에 가장 선호된 노후 준비 방법은?", + "choices": { + "A": "국민연금", + "B": "개인연금", + "C": "부동산", + "D": "주식투자" + }, + "answer": "A", + "category": "chart" + }, + "chart_45": { + "question": "2021년 부동산으로 노후를 준비하는 비율은 몇 퍼센트인가요?", + "choices": { + "A": "64.3%", + "B": "68.9%", + "C": "42.1%", + "D": "31.2%" + }, + "answer": "D", + "category": "chart" + }, + "chart_46": { + "question": "평일과 주말 모두에서 가장 많은 학습 시간을 보내는 학년은 무엇인가요?", + "choices": { + "A": "고등학생", + "B": "중학생", + "C": "대학원생", + "D": "대학생" + }, + "answer": "C", + "category": "chart" + }, + "chart_47": { + "question": "모든 학력에 대해 비교했을때, 평균 학습 시간은 주말에 비해 평일이 항상 많습니까?", + "choices": { + "A": "네", + "B": "아니오", + "C": "없음", + "D": "없음" + }, + "answer": "A", + "category": "chart" + }, + "chart_48": { + "question": "대기 오염도 지수가 45인 도시는 어디인가요?", + "choices": { + "A": "대전", + "B": "서울", + "C": "울산", + "D": "광주" + }, + "answer": "D", + "category": "chart" + }, + "chart_49": { + "question": "대한민국 주요 도시 중 대기 오염도가 가장 높은 도시는 어디인가요?", + "choices": { + "A": "서울", + "B": "부산", + "C": "대구", + "D": "대전" + }, + "answer": "A", + "category": "chart" + }, + "chart_50": { + "question": "직장인들이 스트레스를 해소하는 가장 흔한 방법은 무엇인가요?", + "choices": { + "A": "음악감상", + "B": "독서", + "C": "취미활동", + "D": "요리" + }, + "answer": "A", + "category": "chart" + }, + "chart_51": { + "question": "요리를 통해 스트레스를 해소하는 직장인의 비율은 몇 퍼센트인가요?", + "choices": { + "A": "10.8%", + "B": "3.5%", + "C": "15.6%", + "D": "5.1%" + }, + "answer": "A", + "category": "chart" + }, + "chart_52": { + "question": "주간 보호 서비스의 이용률은 단기 보호와 비교해 얼마나 높은가요?", + "choices": { + "A": "7.9%", + "B": "13.1%", + "C": "16.4%", + "D": "19.3%" + }, + "answer": "B", + "category": "chart" + }, + "chart_53": { + "question": "2023년 노인 복지 서비스 중 가장 많이 이용된 서비스는 무엇인가요?", + "choices": { + "A": "주간 보호", + "B": "방문 요양", + "C": "단기 보호", + "D": "방문 목욕" + }, + "answer": "B", + "category": "chart" + }, + "chart_54": { + "question": "2023년 직장인들의 점심 식사에서 가장 낮은 비율을 차지하는 형태는 무엇인가요?", + "choices": { + "A": "배달음식", + "B": "외식", + "C": "구내식당", + "D": "도시락" + }, + "answer": "D", + "category": "chart" + }, + "chart_55": { + "question": "2023년 직장인들의 점심 식사에서 구내식당을 이용한 비율은 몇 퍼센트인가요?", + "choices": { + "A": "28.1%", + "B": "45.2%", + "C": "10.8%", + "D": "15.3%" + }, + "answer": "B", + "category": "chart" + }, + "chart_56": { + "question": "대학 비진학율이 가장 높은 해는 언제인가요?", + "choices": { + "A": "2017년", + "B": "2018년", + "C": "2019년", + "D": "모두 동일하다" + }, + "answer": "A", + "category": "chart" + }, + "chart_57": { + "question": "2019년 비진학률은 몇 퍼센트인가요?", + "choices": { + "A": "28.5%", + "B": "29.6%", + "C": "30.2%", + "D": "70.4%" + }, + "answer": "B", + "category": "chart" + }, + "chart_58": { + "question": "2023년에 금속 산업의 환경 친화도는 몇 퍼센트인가요?", + "choices": { + "A": "51%", + "B": "53%", + "C": "55%", + "D": "58%" + }, + "answer": "D", + "category": "chart" + }, + "chart_59": { + "question": "2023년 식품 산업과 에너지 산업의 환경 친화도 차이는 몇 퍼센트인가요?", + "choices": { + "A": "8%", + "B": "12%", + "C": "10%", + "D": "6%" + }, + "answer": "C", + "category": "chart" + }, + "chart_60": { + "question": "2023년 취업률이 가장 낮은 연령대는 무엇입니까?", + "choices": { + "A": "50대", + "B": "40대", + "C": "30대", + "D": "20대" + }, + "answer": "D", + "category": "chart" + }, + "chart_61": { + "question": "2023년 50대의 취업률은 몇 퍼센트인가요?", + "choices": { + "A": "73.1%", + "B": "74.1%", + "C": "75.1%", + "D": "76.1%" + }, + "answer": "B", + "category": "chart" + }, + "chart_62": { + "question": "대구에서 남성과 여성의 대학 진학률 차이는 몇 퍼센트인가요?", + "choices": { + "A": "3.2%", + "B": "4.1%", + "C": "5.7%", + "D": "6.4%" + }, + "answer": "A", + "category": "chart" + }, + "chart_63": { + "question": "2022년 인천에서 여학생의 대학 진학률은 몇 퍼센트인가요?", + "choices": { + "A": "71.3%", + "B": "74.5%", + "C": "73.2%", + "D": "76.8%" + }, + "answer": "C", + "category": "chart" + }, + "chart_64": { + "question": "2023년 40대 이상의 남성 이용률은 몇 퍼센트인가요?", + "choices": { + "A": "24.3%", + "B": "26.9%", + "C": "28.1%", + "D": "30.8%" + }, + "answer": "D", + "category": "chart" + }, + "chart_65": { + "question": "2023년 30대 남성의 온라인 교육 플랫폼 이용률은 몇 퍼센트인가요?", + "choices": { + "A": "22.7%", + "B": "28.7%", + "C": "33.6%", + "D": "35.2%" + }, + "answer": "B", + "category": "chart" + }, + "chart_66": { + "question": "2020년 수출액이 제일 낮은 한국 산업은 무엇인가요?", + "choices": { + "A": "자동차", + "B": "조선", + "C": "석유화학", + "D": "반도체" + }, + "answer": "C", + "category": "chart" + }, + "chart_67": { + "question": "2021년 반도체 산업의 수출액은 몇 십억 달러였나요?", + "choices": { + "A": "99.18", + "B": "127.98", + "C": "98.93", + "D": "46.47" + }, + "answer": "B", + "category": "chart" + }, + "chart_68": { + "question": "베이비부머 세대와 밀레니얼 세대 간에 승진 기회 부족으로 인한 스트레스 지수 차이는 몇 인가요?", + "choices": { + "A": "0.9", + "B": "0.7", + "C": "0.5", + "D": "0.3" + }, + "answer": "D", + "category": "chart" + }, + "chart_69": { + "question": "다음 중 베이비부머 세대와 밀레니얼 세대의 스트레스 지수가 가장 많이 차이가 나는 스트레스 요인은 무엇인가요?", + "choices": { + "A": "인간관계", + "B": "성과 압박", + "C": "워라밸 부족", + "D": "승진 기회 부족" + }, + "answer": "C", + "category": "chart" + }, + "chart_70": { + "question": "여성이 남성보다 2023년 온라인 뱅킹 사용률이 높은 연령대는 무엇입니까?", + "choices": { + "A": "20대", + "B": "30대", + "C": "40대", + "D": "정답 없음" + }, + "answer": "D", + "category": "chart" + }, + "chart_71": { + "question": "온라인 뱅킹을 가장 많이 사용하는 연령대는 무엇인가요?", + "choices": { + "A": "20대", + "B": "30대", + "C": "50대", + "D": "60대 이상" + }, + "answer": "A", + "category": "chart" + }, + "chart_72": { + "question": "2023년에 버스를 가장 많이 이용하는 도시는 어떤 도시인가요?", + "choices": { + "A": "서울", + "B": "부산", + "C": "대구", + "D": "모두 동일하다" + }, + "answer": "C", + "category": "chart" + }, + "chart_73": { + "question": "부산에서 지하철을 이용한 비율은 몇 퍼센트인가요?", + "choices": { + "A": "36.0%", + "B": "46.0%", + "C": "25.3%", + "D": "38.7%" + }, + "answer": "C", + "category": "chart" + }, + "chart_74": { + "question": "대학생들이 세 번째로 많이 선택한 전공 계열은 무엇인가요?", + "choices": { + "A": "자연과학계열", + "B": "공학계열", + "C": "예체능계열", + "D": "인문사회계열" + }, + "answer": "A", + "category": "chart" + }, + "chart_75": { + "question": "2023년 대학생 전공 선택에서 인문사회계열이 차지하는 비율은 몇 퍼센트인가요?", + "choices": { + "A": "22.7%", + "B": "35.2%", + "C": "30.1%", + "D": "12.0%" + }, + "answer": "C", + "category": "chart" + }, + "chart_76": { + "question": "연차를 전부 사용한 비율은 몇 퍼센트인가요?", + "choices": { + "A": "18.9%", + "B": "33.5%", + "C": "15.2%", + "D": "3.7%" + }, + "answer": "C", + "category": "chart" + }, + "chart_77": { + "question": "직장인들이 가장 많이 사용하는 연차 사용 패턴은 무엇인가요?", + "choices": { + "A": "거의 사용 안 함", + "B": "절반정도 사용", + "C": "대부분 사용", + "D": "일부만 사용" + }, + "answer": "B", + "category": "chart" + }, + "chart_78": { + "question": "2023년에 해외여행을 가장 선호하는 연령대는 무엇입니까?", + "choices": { + "A": "30대", + "B": "40대", + "C": "50대", + "D": "60대 이상" + }, + "answer": "D", + "category": "chart" + }, + "chart_79": { + "question": "2023년 20대의 국내여행 선호 비율은 몇 퍼센트인가요?", + "choices": { + "A": "24.3%", + "B": "30.5%", + "C": "45.2%", + "D": "38.7%" + }, + "answer": "C", + "category": "chart" + } + }, + "results": { + "bf16": [ + { + "pred": "B", + "probs": { + "A": 44.81703341007233, + "B": 50.78434944152832, + "C": 2.8650572523474693, + "D": 1.5335545875132084 + }, + "correct": true, + "index": "document_0", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 12.737429141998291, + "B": 50.377511978149414, + "C": 26.96513831615448, + "D": 9.919919073581696 + }, + "correct": false, + "index": "document_1", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.37614188622683287, + "B": 1.5836164355278015, + "C": 97.9748785495758, + "D": 0.06536365835927427 + }, + "correct": true, + "index": "document_2", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 18.957044184207916, + "B": 66.16658568382263, + "C": 6.973906606435776, + "D": 7.902471721172333 + }, + "correct": true, + "index": "document_3", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 5.021760240197182, + "B": 94.75365877151489, + "C": 0.1947147655300796, + "D": 0.029860477661713958 + }, + "correct": false, + "index": "document_4", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 1.0858154855668545, + "B": 1.5798522159457207, + "C": 5.514226108789444, + "D": 91.82010889053345 + }, + "correct": true, + "index": "document_5", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 99.70139265060425, + "B": 0.19246897427365184, + "C": 0.10302121518179774, + "D": 0.0031109713745536283 + }, + "correct": true, + "index": "document_6", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.017728807870298624, + "B": 1.242885459214449, + "C": 98.73462319374084, + "D": 0.00477164430776611 + }, + "correct": true, + "index": "document_7", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0012597892236954067, + "B": 0.06666596163995564, + "C": 99.92693066596985, + "D": 0.005140727080288343 + }, + "correct": true, + "index": "document_8", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.97935891151428, + "B": 0.017952313646674156, + "C": 0.002144098107237369, + "D": 0.0005421129117166856 + }, + "correct": true, + "index": "document_9", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 1.7834514379501343, + "B": 11.629564315080643, + "C": 40.59116840362549, + "D": 45.99581956863403 + }, + "correct": true, + "index": "document_10", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.060529710026457906, + "B": 2.5737889111042023, + "C": 0.7849613204598427, + "D": 96.58071994781494 + }, + "correct": true, + "index": "document_11", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 4.870028421282768, + "B": 91.89069867134094, + "C": 3.1443268060684204, + "D": 0.09495043777860701 + }, + "correct": true, + "index": "document_12", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.8675375506281853, + "B": 78.7244439125061, + "C": 13.68025541305542, + "D": 4.7277700155973434 + }, + "correct": false, + "index": "document_13", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.02231135149486363, + "B": 58.6941659450531, + "C": 24.467366933822632, + "D": 16.816160082817078 + }, + "correct": false, + "index": "document_14", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.443424541503191, + "B": 32.85219073295593, + "C": 32.85219073295593, + "D": 32.85219073295593 + }, + "correct": false, + "index": "document_15", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.2489319769665599, + "B": 1.2641808949410915, + "C": 4.145089536905289, + "D": 94.3418025970459 + }, + "correct": true, + "index": "document_16", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 96.2022602558136, + "B": 3.730166330933571, + "C": 0.06418105913326144, + "D": 0.0034014716220553964 + }, + "correct": true, + "index": "document_17", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.33932654187083244, + "B": 3.219440206885338, + "C": 94.08584237098694, + "D": 2.355393022298813 + }, + "correct": false, + "index": "document_18", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.15603512292727828, + "B": 97.49740958213806, + "C": 0.9558310732245445, + "D": 1.390725839883089 + }, + "correct": true, + "index": "document_19", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 85.33656001091003, + "B": 3.1083840876817703, + "C": 11.549047380685806, + "D": 0.006000593202770688 + }, + "correct": true, + "index": "document_20", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.03798006218858063, + "B": 0.03351728664711118, + "C": 99.91362690925598, + "D": 0.01487320550950244 + }, + "correct": true, + "index": "document_21", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.0148825827636756, + "B": 99.97661709785461, + "C": 0.006604105874430388, + "D": 0.0018921080481959507 + }, + "correct": true, + "index": "document_22", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0004936513960274169, + "B": 0.007484426168957725, + "C": 99.98987913131714, + "D": 0.002144323843822349 + }, + "correct": true, + "index": "document_23", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.005828510256833397, + "B": 99.98359680175781, + "C": 0.007030525739537552, + "D": 0.0035351702535990626 + }, + "correct": true, + "index": "document_24", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 21.72742635011673, + "B": 9.057338535785675, + "C": 66.92518591880798, + "D": 2.290053851902485 + }, + "correct": false, + "index": "document_25", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.001300566509598866, + "B": 0.0037633137253578752, + "C": 99.9874472618103, + "D": 0.007484244270017371 + }, + "correct": true, + "index": "document_26", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.9635100364685, + "B": 0.031502300407737494, + "C": 0.00453833636129275, + "D": 0.00044935613914276473 + }, + "correct": true, + "index": "document_27", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 78.19264531135559, + "B": 17.4471378326416, + "C": 3.435545042157173, + "D": 0.9246643632650375 + }, + "correct": true, + "index": "document_28", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.25898427702486515, + "B": 1.2355448678135872, + "C": 98.15148711204529, + "D": 0.35398954059928656 + }, + "correct": true, + "index": "document_29", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.97082352638245, + "B": 0.016863198834471405, + "C": 0.0048313875595340505, + "D": 0.007483000081265345 + }, + "correct": true, + "index": "document_30", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.74381923675537, + "B": 0.21818873938173056, + "C": 0.03346032463014126, + "D": 0.004528362478595227 + }, + "correct": true, + "index": "document_31", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.0084794606664218, + "B": 0.007029720291029662, + "C": 99.97214674949646, + "D": 0.012337543012108654 + }, + "correct": true, + "index": "document_32", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.027284474344924092, + "B": 0.9618109092116356, + "C": 0.9035375900566578, + "D": 98.10737371444702 + }, + "correct": true, + "index": "document_33", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.9634644724428654, + "B": 98.27604293823242, + "C": 0.4844603128731251, + "D": 0.2760371891781688 + }, + "correct": true, + "index": "document_34", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.001775160853867419, + "B": 0.019084775703959167, + "C": 0.13247460592538118, + "D": 99.84667301177979 + }, + "correct": true, + "index": "document_35", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0011124318007205147, + "B": 0.003119892062386498, + "C": 99.98729228973389, + "D": 0.008480745600536466 + }, + "correct": true, + "index": "document_36", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.04230873310007155, + "B": 98.22278618812561, + "C": 1.491434220224619, + "D": 0.24346995633095503 + }, + "correct": true, + "index": "document_37", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.5538525991141796, + "B": 99.15093183517456, + "C": 0.01672489888733253, + "D": 0.2784945769235492 + }, + "correct": false, + "index": "document_38", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.01685366441961378, + "B": 0.04581301182042807, + "C": 0.02303622750332579, + "D": 99.91430044174194 + }, + "correct": true, + "index": "document_39", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 6.285789608955383, + "B": 52.6302695274353, + "C": 40.98849594593048, + "D": 0.09544466738589108 + }, + "correct": false, + "index": "document_40", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.8860587142407894, + "B": 29.342231154441833, + "C": 45.446136593818665, + "D": 24.325565993785858 + }, + "correct": false, + "index": "document_41", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.21289743017405272, + "B": 4.845523089170456, + "C": 85.88895201683044, + "D": 9.0526282787323 + }, + "correct": false, + "index": "document_42", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.2323110355064273, + "B": 99.76544976234436, + "C": 0.0017737169400788844, + "D": 0.0004627016096492298 + }, + "correct": true, + "index": "document_43", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.00960916731855832, + "B": 99.97921586036682, + "C": 0.009026977932080626, + "D": 0.002144095014955383 + }, + "correct": true, + "index": "document_44", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.0006719943030475406, + "B": 0.009571066038915887, + "C": 0.4069720860570669, + "D": 99.5827853679657 + }, + "correct": false, + "index": "document_45", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.667747063562274, + "B": 0.2167857252061367, + "C": 99.10244941711426, + "D": 0.013018996105529368 + }, + "correct": true, + "index": "document_46", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 91.95372462272644, + "B": 3.795383498072624, + "C": 0.9014826267957687, + "D": 3.3494140952825546 + }, + "correct": true, + "index": "document_47", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.04628396034241, + "B": 0.7562276441603899, + "C": 0.13141266535967588, + "D": 0.06607844261452556 + }, + "correct": true, + "index": "document_48", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 39.84020948410034, + "B": 27.38175094127655, + "C": 31.02758824825287, + "D": 1.750456728041172 + }, + "correct": false, + "index": "document_49", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.07945658289827406, + "B": 0.9679793380200863, + "C": 98.736572265625, + "D": 0.2159853931516409 + }, + "correct": false, + "index": "document_50", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.39512161165475845, + "B": 0.7857931777834892, + "C": 2.136007137596607, + "D": 96.68307304382324 + }, + "correct": true, + "index": "document_51", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 63.13117742538452, + "B": 1.3947493396699429, + "C": 1.6823887825012207, + "D": 33.79168510437012 + }, + "correct": false, + "index": "document_52", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 56.21326565742493, + "B": 43.77893507480621, + "C": 0.005402749957283959, + "D": 0.0023974556825123727 + }, + "correct": false, + "index": "document_53", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 80.1632285118103, + "B": 3.9910919964313507, + "C": 15.785074234008789, + "D": 0.06060153245925903 + }, + "correct": true, + "index": "document_54", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 3.8500435650348663, + "B": 87.62658834457397, + "C": 7.192828506231308, + "D": 1.3305393978953362 + }, + "correct": false, + "index": "document_55", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.5765038542449474, + "B": 96.95304036140442, + "C": 2.1419716998934746, + "D": 0.3284820122644305 + }, + "correct": false, + "index": "document_56", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.06256630294956267, + "B": 99.83028173446655, + "C": 0.10315439430996776, + "D": 0.003999729597126134 + }, + "correct": true, + "index": "document_57", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 36.439111828804016, + "B": 46.78874313831329, + "C": 10.439980030059814, + "D": 6.332167983055115 + }, + "correct": true, + "index": "document_58", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0028825164918089285, + "B": 0.06983698112890124, + "C": 98.33779335021973, + "D": 1.5894822776317596 + }, + "correct": false, + "index": "document_59", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0005092286301078275, + "B": 0.02165295009035617, + "C": 99.97163414955139, + "D": 0.006203674274729565 + }, + "correct": true, + "index": "document_60", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.06416136166080832, + "B": 79.72999215126038, + "C": 20.15889883041382, + "D": 0.046941451728343964 + }, + "correct": false, + "index": "document_61", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 3.1113235279917717, + "B": 96.79043292999268, + "C": 0.08291395497508347, + "D": 0.015337539662141353 + }, + "correct": true, + "index": "document_62", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 1.0986439883708954, + "B": 5.241337791085243, + "C": 0.7550863083451986, + "D": 92.90492534637451 + }, + "correct": true, + "index": "document_63", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.071057841181755, + "B": 96.4135468006134, + "C": 1.3752653263509274, + "D": 1.1401349678635597 + }, + "correct": false, + "index": "document_64", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.24698690976947546, + "B": 0.08535638335160911, + "C": 99.64162111282349, + "D": 0.02603222383186221 + }, + "correct": true, + "index": "document_65", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.023044494446367025, + "B": 99.95015859603882, + "C": 0.021648299298249185, + "D": 0.005141922156326473 + }, + "correct": true, + "index": "document_66", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.002429718733765185, + "B": 99.98500347137451, + "C": 0.009027500345837325, + "D": 0.0035352200939087197 + }, + "correct": true, + "index": "document_67", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 91.4266586303711, + "B": 8.504003286361694, + "C": 0.06492887041531503, + "D": 0.004418465323396958 + }, + "correct": true, + "index": "document_68", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 94.73652839660645, + "B": 5.020852014422417, + "C": 0.23482840042561293, + "D": 0.007788162474753335 + }, + "correct": true, + "index": "document_69", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.0006720565124851419, + "B": 0.10954518802464008, + "C": 0.29777472373098135, + "D": 99.59200620651245 + }, + "correct": true, + "index": "document_70", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0025863660994218662, + "B": 0.00660451696603559, + "C": 99.98283386230469, + "D": 0.00796656750026159 + }, + "correct": true, + "index": "document_71", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 2.402961440384388, + "B": 95.9859549999237, + "C": 1.4574697241187096, + "D": 0.15361618716269732 + }, + "correct": true, + "index": "document_72", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 48.45382869243622, + "B": 33.30179750919342, + "C": 17.82516986131668, + "D": 0.41920775547623634 + }, + "correct": true, + "index": "document_73", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.78246688842773, + "B": 0.1809548819437623, + "C": 0.03347328747622669, + "D": 0.003113500861218199 + }, + "correct": true, + "index": "document_74", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.0127626713947393, + "B": 23.07545244693756, + "C": 5.834388360381126, + "D": 71.07740044593811 + }, + "correct": true, + "index": "document_75", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.10306964395567775, + "B": 99.74827170372009, + "C": 0.0968249689321965, + "D": 0.051826675189659 + }, + "correct": true, + "index": "document_76", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.98947381973267, + "B": 0.008480930409859866, + "C": 0.0017776997992768884, + "D": 0.00027261908144282643 + }, + "correct": true, + "index": "document_77", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.602484680712223, + "B": 95.18353939056396, + "C": 2.2385023534297943, + "D": 1.9754713401198387 + }, + "correct": false, + "index": "document_78", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0027372057957109064, + "B": 0.03132566052954644, + "C": 49.98297095298767, + "D": 49.98297095298767 + }, + "correct": false, + "index": "document_79", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.31037444714456797, + "B": 86.05823516845703, + "C": 9.070470929145813, + "D": 4.560919106006622 + }, + "correct": false, + "index": "table_0", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 34.641626477241516, + "B": 57.114386558532715, + "C": 7.261278480291367, + "D": 0.9827072732150555 + }, + "correct": false, + "index": "table_1", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 96.85011506080627, + "B": 2.1396977826952934, + "C": 0.9494852274656296, + "D": 0.0606985529884696 + }, + "correct": true, + "index": "table_2", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.1004027551971376, + "B": 97.16731905937195, + "C": 1.7796814441680908, + "D": 0.9525949135422707 + }, + "correct": true, + "index": "table_3", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.0422557262936607, + "B": 0.4835911560803652, + "C": 18.14662516117096, + "D": 81.32753372192383 + }, + "correct": false, + "index": "table_4", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.0012982260159333237, + "B": 0.031453141127713025, + "C": 0.1597322174347937, + "D": 99.80751276016235 + }, + "correct": true, + "index": "table_5", + "category": "table", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 1.203592959791422, + "B": 39.85752463340759, + "C": 13.774390518665314, + "D": 45.16449272632599 + }, + "correct": true, + "index": "table_6", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 10.305730998516083, + "B": 2.952641248703003, + "C": 86.28882765769958, + "D": 0.45280219055712223 + }, + "correct": false, + "index": "table_7", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.08787580882199109, + "B": 96.36752605438232, + "C": 3.5101868212223053, + "D": 0.0344126601703465 + }, + "correct": true, + "index": "table_8", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.7360149174928665, + "B": 51.59863233566284, + "C": 2.129729837179184, + "D": 45.535629987716675 + }, + "correct": true, + "index": "table_9", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.5063987113535404, + "B": 49.88507330417633, + "C": 30.2568256855011, + "D": 18.35169494152069 + }, + "correct": false, + "index": "table_10", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 7.402359694242477, + "B": 42.5976425409317, + "C": 42.5976425409317, + "D": 7.402359694242477 + }, + "correct": true, + "index": "table_11", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.648569293320179, + "B": 12.967002391815186, + "C": 84.55547094345093, + "D": 0.8289527148008347 + }, + "correct": false, + "index": "table_12", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.03352385829202831, + "B": 99.93321299552917, + "C": 0.02304058871231973, + "D": 0.010224198922514915 + }, + "correct": false, + "index": "table_13", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 1.1689147911965847, + "B": 49.70351755619049, + "C": 38.709139823913574, + "D": 10.418423265218735 + }, + "correct": false, + "index": "table_14", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 5.687309056520462, + "B": 65.08780717849731, + "C": 27.132636308670044, + "D": 2.092244289815426 + }, + "correct": false, + "index": "table_15", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 28.19111943244934, + "B": 52.66793966293335, + "C": 17.09877699613571, + "D": 2.0421577617526054 + }, + "correct": true, + "index": "table_16", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 33.16982686519623, + "B": 61.96938753128052, + "C": 4.778566211462021, + "D": 0.08221977623179555 + }, + "correct": true, + "index": "table_17", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.01580965326866135, + "B": 0.03346903540659696, + "C": 99.76978898048401, + "D": 0.18093188991770148 + }, + "correct": true, + "index": "table_18", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 1.9548304378986359, + "B": 23.814712464809418, + "C": 23.814712464809418, + "D": 50.41574239730835 + }, + "correct": false, + "index": "table_19", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 2.5030631572008133, + "B": 28.646039962768555, + "C": 60.64366698265076, + "D": 8.207228034734726 + }, + "correct": false, + "index": "table_20", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 3.864891827106476, + "B": 82.63502717018127, + "C": 9.869346767663956, + "D": 3.630729764699936 + }, + "correct": true, + "index": "table_21", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.026110169710591435, + "B": 99.93996620178223, + "C": 0.010884339280892164, + "D": 0.023042144312057644 + }, + "correct": true, + "index": "table_22", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 17.6618754863739, + "B": 22.678297758102417, + "C": 57.911062240600586, + "D": 1.7487626522779465 + }, + "correct": false, + "index": "table_23", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.037967495154589415, + "B": 99.88056421279907, + "C": 0.02956911630462855, + "D": 0.05189541261643171 + }, + "correct": true, + "index": "table_24", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.08456921204924583, + "B": 67.85105466842651, + "C": 32.05057084560394, + "D": 0.01380554458592087 + }, + "correct": false, + "index": "table_25", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.20332362037152052, + "B": 36.39908730983734, + "C": 60.01194715499878, + "D": 3.3856425434350967 + }, + "correct": false, + "index": "table_26", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.8216952905058861, + "B": 78.73708605766296, + "C": 18.701697885990143, + "D": 1.739528775215149 + }, + "correct": false, + "index": "table_27", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0003966622898587957, + "B": 0.004006146627943963, + "C": 99.99045133590698, + "D": 0.005143995076650754 + }, + "correct": true, + "index": "table_28", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 1.1534078046679497, + "B": 1.0835264809429646, + "C": 97.53594398498535, + "D": 0.22711947094649076 + }, + "correct": true, + "index": "table_29", + "category": "table", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 94.54474449157715, + "B": 5.333849787712097, + "C": 0.11784009402617812, + "D": 0.0035584620491135865 + }, + "correct": true, + "index": "table_30", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.04302063607610762, + "B": 99.87552165985107, + "C": 0.05189279327169061, + "D": 0.02956762327812612 + }, + "correct": true, + "index": "table_31", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.018946417549159378, + "B": 0.6274191662669182, + "C": 0.2308146096765995, + "D": 99.12281036376953 + }, + "correct": true, + "index": "table_32", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.031417791615240276, + "B": 0.21808270830661058, + "C": 99.69534873962402, + "D": 0.05513993673957884 + }, + "correct": true, + "index": "table_33", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.24634231813251972, + "B": 0.1802278682589531, + "C": 99.38157796859741, + "D": 0.19185157725587487 + }, + "correct": true, + "index": "table_34", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 22.023475170135498, + "B": 76.8694818019867, + "C": 0.9676439687609673, + "D": 0.13940231874585152 + }, + "correct": false, + "index": "table_35", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 74.459969997406, + "B": 1.203533262014389, + "C": 0.16288053011521697, + "D": 24.173612892627716 + }, + "correct": true, + "index": "table_36", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 4.476737976074219, + "B": 61.799460649490356, + "C": 33.07886719703674, + "D": 0.6449352484196424 + }, + "correct": false, + "index": "table_37", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.8886783383786678, + "B": 45.580506324768066, + "C": 51.64948105812073, + "D": 1.8813321366906166 + }, + "correct": false, + "index": "table_38", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.201257667504251, + "B": 86.4296555519104, + "C": 13.254417479038239, + "D": 0.11467316653579473 + }, + "correct": false, + "index": "table_39", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 26.05503499507904, + "B": 33.45532417297363, + "C": 37.9098504781723, + "D": 2.5797976180911064 + }, + "correct": false, + "index": "table_40", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 8.00238847732544, + "B": 67.00317859649658, + "C": 20.43481320142746, + "D": 4.559623450040817 + }, + "correct": true, + "index": "table_41", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0703050522133708, + "B": 9.20814424753189, + "C": 82.07130432128906, + "D": 8.650251477956772 + }, + "correct": true, + "index": "table_42", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.0020480687453527935, + "B": 0.08440673700533807, + "C": 18.226781487464905, + "D": 81.68675899505615 + }, + "correct": true, + "index": "table_43", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.12606421951204538, + "B": 1.8525000661611557, + "C": 73.99784922599792, + "D": 24.02358502149582 + }, + "correct": false, + "index": "table_44", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.4388615041971207, + "B": 97.41997718811035, + "C": 0.11406706180423498, + "D": 0.02709330292418599 + }, + "correct": true, + "index": "table_45", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.005143264206708409, + "B": 99.976247549057, + "C": 0.013133785978425294, + "D": 0.005474975841934793 + }, + "correct": true, + "index": "table_46", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.3304817946627736, + "B": 97.54329323768616, + "C": 1.2278888374567032, + "D": 0.8983426727354527 + }, + "correct": false, + "index": "table_47", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.401483431458473, + "B": 48.23508560657501, + "C": 29.256057739257812, + "D": 20.10737508535385 + }, + "correct": false, + "index": "table_48", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 22.550663352012634, + "B": 69.46093440055847, + "C": 7.793300598859787, + "D": 0.19510147394612432 + }, + "correct": false, + "index": "table_49", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 34.690096974372864, + "B": 50.4737913608551, + "C": 11.988577246665955, + "D": 2.847536653280258 + }, + "correct": false, + "index": "table_50", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.15686008846387267, + "B": 21.869629621505737, + "C": 71.70775532722473, + "D": 6.265753507614136 + }, + "correct": true, + "index": "table_51", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.023039452207740396, + "B": 99.92828965187073, + "C": 0.02958324330393225, + "D": 0.019100375357083976 + }, + "correct": true, + "index": "table_52", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.009595620940672234, + "B": 99.83826875686646, + "C": 0.09691233281046152, + "D": 0.05521898274309933 + }, + "correct": true, + "index": "table_53", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 32.354629039764404, + "B": 41.54416620731354, + "C": 22.236990928649902, + "D": 3.8642093539237976 + }, + "correct": true, + "index": "table_54", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 57.877033948898315, + "B": 39.77826535701752, + "C": 2.108170837163925, + "D": 0.2365302061662078 + }, + "correct": true, + "index": "table_55", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 5.85048571228981, + "B": 2.1522734314203262, + "C": 91.51699542999268, + "D": 0.4802371375262737 + }, + "correct": false, + "index": "table_56", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.019084189261775464, + "B": 0.09691751329228282, + "C": 99.84360337257385, + "D": 0.04040123021695763 + }, + "correct": true, + "index": "table_57", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 7.897651940584183, + "B": 90.38384556770325, + "C": 0.8324064314365387, + "D": 0.8860921487212181 + }, + "correct": false, + "index": "table_58", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.0020138446416240185, + "B": 0.01910682476591319, + "C": 99.96201992034912, + "D": 0.01686171453911811 + }, + "correct": true, + "index": "table_59", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.3509978298097849, + "B": 18.00275444984436, + "C": 26.193854212760925, + "D": 55.452388525009155 + }, + "correct": true, + "index": "table_60", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.020146751194261014, + "B": 0.8047591894865036, + "C": 99.01662468910217, + "D": 0.15846648020669818 + }, + "correct": true, + "index": "table_61", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0014737815945409238, + "B": 0.002753386797849089, + "C": 99.99061822891235, + "D": 0.00514400344400201 + }, + "correct": true, + "index": "table_62", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.0053185522119747475, + "B": 0.27278969064354897, + "C": 8.48623812198639, + "D": 91.23566150665283 + }, + "correct": true, + "index": "table_63", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.213304117321968, + "B": 17.408986389636993, + "C": 78.02165746688843, + "D": 2.3560499772429466 + }, + "correct": true, + "index": "table_64", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0016691101336618885, + "B": 0.026109273312613368, + "C": 99.93653893470764, + "D": 0.035687146009877324 + }, + "correct": true, + "index": "table_65", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.0771679449826479, + "B": 79.49776649475098, + "C": 20.10018229484558, + "D": 0.32488920260220766 + }, + "correct": true, + "index": "table_66", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.62760210037231, + "B": 0.20473049953579903, + "C": 0.14978403924033046, + "D": 0.01788915105862543 + }, + "correct": true, + "index": "table_67", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.99191761016846, + "B": 0.005828995199408382, + "C": 0.0017777432731236331, + "D": 0.00047847311179793905 + }, + "correct": true, + "index": "table_68", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.001670101482886821, + "B": 99.99589920043945, + "C": 0.001892472937470302, + "D": 0.0005422025878942804 + }, + "correct": true, + "index": "table_69", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.040426902705803514, + "B": 0.016852440603543073, + "C": 0.03567661333363503, + "D": 99.90704655647278 + }, + "correct": true, + "index": "table_70", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 95.04374265670776, + "B": 4.731949046254158, + "C": 0.12610217090696096, + "D": 0.09820846607908607 + }, + "correct": true, + "index": "table_71", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 9.53112542629242, + "B": 62.15074062347412, + "C": 25.90828239917755, + "D": 2.4098457768559456 + }, + "correct": true, + "index": "table_72", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.4891693592071533, + "B": 72.59916663169861, + "C": 26.707744598388672, + "D": 0.2039161277934909 + }, + "correct": true, + "index": "table_73", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 15.86642861366272, + "B": 48.87203872203827, + "C": 33.58922898769379, + "D": 1.6723092645406723 + }, + "correct": false, + "index": "table_74", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.1969396136701107, + "B": 95.83633542060852, + "C": 3.279338777065277, + "D": 0.6873867474496365 + }, + "correct": true, + "index": "table_75", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.029592105420306325, + "B": 99.95822310447693, + "C": 0.01088632780010812, + "D": 0.001300186340813525 + }, + "correct": true, + "index": "table_76", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.2249868363142014, + "B": 71.19553685188293, + "C": 26.191377639770508, + "D": 1.388092152774334 + }, + "correct": false, + "index": "table_77", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.679202564060688, + "B": 73.74876141548157, + "C": 23.942716419696808, + "D": 1.6293222084641457 + }, + "correct": true, + "index": "table_78", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.6933666542172432, + "B": 7.129339128732681, + "C": 86.85312867164612, + "D": 4.3241627514362335 + }, + "correct": false, + "index": "table_79", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.6367027759552002, + "B": 61.01059913635254, + "C": 37.004801630973816, + "D": 1.347899716347456 + }, + "correct": false, + "index": "chart_0", + "category": "chart", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 1.5617012977600098, + "B": 13.919292390346527, + "C": 29.46714162826538, + "D": 55.05186915397644 + }, + "correct": false, + "index": "chart_1", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.02602366730570793, + "B": 99.60887432098389, + "C": 0.279780849814415, + "D": 0.08532832725904882 + }, + "correct": true, + "index": "chart_2", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.448286697268486, + "B": 24.116136133670807, + "C": 74.28293228149414, + "D": 0.15264827525243163 + }, + "correct": false, + "index": "chart_3", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.24723364040255547, + "B": 99.74116683006287, + "C": 0.00958628806984052, + "D": 0.002009395211644005 + }, + "correct": true, + "index": "chart_4", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.016859604511409998, + "B": 99.94951486587524, + "C": 0.027796789072453976, + "D": 0.005826523556606844 + }, + "correct": true, + "index": "chart_5", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.8523946404457092, + "B": 54.13490533828735, + "C": 42.16030836105347, + "D": 1.8523946404457092 + }, + "correct": false, + "index": "chart_6", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.497914247214794, + "B": 68.57692003250122, + "C": 28.587111830711365, + "D": 0.3380559151992202 + }, + "correct": false, + "index": "chart_7", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 39.90064859390259, + "B": 51.23344659805298, + "C": 8.363630622625351, + "D": 0.5022750701755285 + }, + "correct": false, + "index": "chart_8", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.1595244519412518, + "B": 98.05318713188171, + "C": 0.7032871246337891, + "D": 0.08399567450396717 + }, + "correct": true, + "index": "chart_9", + "category": "chart", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.007933515007607639, + "B": 0.23185128811746836, + "C": 0.19221148686483502, + "D": 99.56800937652588 + }, + "correct": true, + "index": "chart_10", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 50.669193267822266, + "B": 39.46120738983154, + "C": 9.372858703136444, + "D": 0.49674329347908497 + }, + "correct": false, + "index": "chart_11", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.9226236492395401, + "B": 88.40831518173218, + "C": 10.558867454528809, + "D": 0.1101916772313416 + }, + "correct": true, + "index": "chart_12", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.002144090467481874, + "B": 0.010888590622926131, + "C": 99.97900128364563, + "D": 0.007966261910041794 + }, + "correct": true, + "index": "chart_13", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.89275336265564, + "B": 0.0855715130455792, + "C": 0.016850030806381255, + "D": 0.004827614611713216 + }, + "correct": true, + "index": "chart_14", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.03565531224012375, + "B": 93.79793405532837, + "C": 5.996301025152206, + "D": 0.17010197043418884 + }, + "correct": true, + "index": "chart_15", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0058254321629647166, + "B": 0.020332756685093045, + "C": 99.93079900741577, + "D": 0.043044445919804275 + }, + "correct": true, + "index": "chart_16", + "category": "chart", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.20180079154670238, + "B": 0.7981376722455025, + "C": 0.7981376722455025, + "D": 98.20191860198975 + }, + "correct": true, + "index": "chart_17", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.3673465698957443, + "B": 84.59473848342896, + "C": 12.97302395105362, + "D": 1.0648906230926514 + }, + "correct": true, + "index": "chart_18", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 3.4742824733257294, + "B": 47.9609876871109, + "C": 47.9609876871109, + "D": 0.6037397310137749 + }, + "correct": true, + "index": "chart_19", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.0673563927412033, + "B": 16.69626384973526, + "C": 74.82746243476868, + "D": 7.408922165632248 + }, + "correct": true, + "index": "chart_20", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 25.58518648147583, + "B": 54.16383743286133, + "C": 15.518198907375336, + "D": 4.732783138751984 + }, + "correct": false, + "index": "chart_21", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 12.016642838716507, + "B": 69.15100812911987, + "C": 17.484113574028015, + "D": 1.3482301495969296 + }, + "correct": true, + "index": "chart_22", + "category": "chart", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 98.87776970863342, + "B": 1.0318821296095848, + "C": 0.07957020425237715, + "D": 0.010768656647996977 + }, + "correct": true, + "index": "chart_23", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.5332999397069216, + "B": 51.102256774902344, + "C": 45.097580552101135, + "D": 3.26685793697834 + }, + "correct": false, + "index": "chart_24", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 3.3706296235322952, + "B": 67.7009105682373, + "C": 28.221938014030457, + "D": 0.7065224461257458 + }, + "correct": false, + "index": "chart_25", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.022514970623888075, + "B": 0.7455934304744005, + "C": 97.65347242355347, + "D": 1.5784213319420815 + }, + "correct": false, + "index": "chart_26", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.0911568999290466, + "B": 98.22281002998352, + "C": 0.48419791273772717, + "D": 0.20184372551739216 + }, + "correct": true, + "index": "chart_27", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.019108850392512977, + "B": 99.97262358665466, + "C": 0.005143077942193486, + "D": 0.0031194344046525657 + }, + "correct": true, + "index": "chart_28", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.016781585873104632, + "B": 99.48699474334717, + "C": 0.4904298111796379, + "D": 0.005799560676678084 + }, + "correct": true, + "index": "chart_29", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.2775565953925252, + "B": 81.92216157913208, + "C": 5.237108469009399, + "D": 12.563170492649078 + }, + "correct": false, + "index": "chart_30", + "category": "chart", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.12666323455050588, + "B": 3.2666876912117004, + "C": 30.993470549583435, + "D": 65.61318039894104 + }, + "correct": false, + "index": "chart_31", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.06951434770599008, + "B": 1.0873873718082905, + "C": 97.8834867477417, + "D": 0.9596159681677818 + }, + "correct": true, + "index": "chart_32", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 91.359943151474, + "B": 7.982942461967468, + "C": 0.5432460457086563, + "D": 0.11387057602405548 + }, + "correct": true, + "index": "chart_33", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.38908207789063454, + "B": 78.92792224884033, + "C": 19.956104457378387, + "D": 0.7269009947776794 + }, + "correct": false, + "index": "chart_34", + "category": "chart", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 53.112709522247314, + "B": 46.87180519104004, + "C": 0.0115037320938427, + "D": 0.003975583967985585 + }, + "correct": false, + "index": "chart_35", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.5151672065258026, + "B": 30.43294847011566, + "C": 56.85623288154602, + "D": 11.195655167102814 + }, + "correct": false, + "index": "chart_36", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.42779678478837013, + "B": 28.173816204071045, + "C": 67.5854742527008, + "D": 3.812911733984947 + }, + "correct": false, + "index": "chart_37", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.774641290307045, + "B": 76.17409229278564, + "C": 19.259826838970184, + "D": 1.7914429306983948 + }, + "correct": true, + "index": "chart_38", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.054795597679913044, + "B": 0.7564298342913389, + "C": 99.07276630401611, + "D": 0.11600228026509285 + }, + "correct": true, + "index": "chart_39", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 56.97858929634094, + "B": 26.91478133201599, + "C": 9.301499277353287, + "D": 6.805122643709183 + }, + "correct": true, + "index": "chart_40", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.2873083809390664, + "B": 62.041330337524414, + "C": 37.62997090816498, + "D": 0.04139069642405957 + }, + "correct": true, + "index": "chart_41", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.311287634074688, + "B": 67.54572987556458, + "C": 15.071488916873932, + "D": 15.071488916873932 + }, + "correct": false, + "index": "chart_42", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.02291632117703557, + "B": 0.0276423612376675, + "C": 99.39423203468323, + "D": 0.555211678147316 + }, + "correct": true, + "index": "chart_43", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 3.4616000950336456, + "B": 32.84274935722351, + "C": 30.85290789604187, + "D": 32.84274935722351 + }, + "correct": false, + "index": "chart_44", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.6473835110664368, + "B": 87.66930103302002, + "C": 7.196334004402161, + "D": 2.486986666917801 + }, + "correct": false, + "index": "chart_45", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.805194303393364, + "B": 32.16337561607361, + "C": 49.81561005115509, + "D": 17.21581518650055 + }, + "correct": true, + "index": "chart_46", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 8.340984582901001, + "B": 89.67403769493103, + "C": 1.7483655363321304, + "D": 0.23661553859710693 + }, + "correct": false, + "index": "chart_47", + "category": "chart", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.09570658439770341, + "B": 8.09326097369194, + "C": 32.00947046279907, + "D": 59.80156064033508 + }, + "correct": true, + "index": "chart_48", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 99.88747239112854, + "B": 0.09108558879233897, + "C": 0.013968427083455026, + "D": 0.007476760947611183 + }, + "correct": true, + "index": "chart_49", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.066391706466675, + "B": 50.0640869140625, + "C": 41.50458574295044, + "D": 6.364933401346207 + }, + "correct": false, + "index": "chart_50", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 6.248649954795837, + "B": 7.537310570478439, + "C": 81.0337245464325, + "D": 5.180312693119049 + }, + "correct": false, + "index": "chart_51", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.1763550117611885, + "B": 92.54096150398254, + "C": 4.904491454362869, + "D": 0.3781937761232257 + }, + "correct": true, + "index": "chart_52", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.04876602615695447, + "B": 99.91087317466736, + "C": 0.01583200937602669, + "D": 0.02452109765727073 + }, + "correct": true, + "index": "chart_53", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.2501370161771774, + "B": 20.81664949655533, + "C": 41.398853063583374, + "D": 36.53435707092285 + }, + "correct": false, + "index": "chart_54", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.7163403555750847, + "B": 88.13767433166504, + "C": 9.888772666454315, + "D": 1.2572163715958595 + }, + "correct": true, + "index": "chart_55", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 4.696014150977135, + "B": 69.00742650032043, + "C": 22.403429448604584, + "D": 3.893132507801056 + }, + "correct": false, + "index": "chart_56", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.007027490210020915, + "B": 99.94043111801147, + "C": 0.04878045292571187, + "D": 0.003761544212466106 + }, + "correct": true, + "index": "chart_57", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0061391430790536106, + "B": 1.9288614392280579, + "C": 63.87511491775513, + "D": 34.18988883495331 + }, + "correct": false, + "index": "chart_58", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.7054425552487373, + "B": 93.11400651931763, + "C": 4.93486151099205, + "D": 0.24569227825850248 + }, + "correct": false, + "index": "chart_59", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 4.98201847076416, + "B": 16.33540987968445, + "C": 68.77464056015015, + "D": 9.907926619052887 + }, + "correct": false, + "index": "chart_60", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 11.607584357261658, + "B": 66.79704189300537, + "C": 20.371945202350616, + "D": 1.2234305031597614 + }, + "correct": true, + "index": "chart_61", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.1977680958807468, + "B": 74.10328984260559, + "C": 24.057815968990326, + "D": 0.6411190610378981 + }, + "correct": false, + "index": "chart_62", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.01157572987722233, + "B": 0.04873564466834068, + "C": 99.84862804412842, + "D": 0.09105016943067312 + }, + "correct": true, + "index": "chart_63", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.8428877219557762, + "B": 91.52191877365112, + "C": 5.850800126791, + "D": 1.7843933776021004 + }, + "correct": false, + "index": "chart_64", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.013128048158250749, + "B": 99.93257522583008, + "C": 0.04582138790283352, + "D": 0.008476104267174378 + }, + "correct": true, + "index": "chart_65", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.7827566266059875, + "B": 23.172195255756378, + "C": 43.29135715961456, + "D": 29.753687977790833 + }, + "correct": true, + "index": "chart_66", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 6.271747499704361, + "B": 71.77634835243225, + "C": 18.147902190685272, + "D": 3.8040071725845337 + }, + "correct": true, + "index": "chart_67", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.0556945353746414, + "B": 82.11442828178406, + "C": 7.175078243017197, + "D": 8.654797077178955 + }, + "correct": false, + "index": "chart_68", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.253483303822577, + "B": 3.2872214913368225, + "C": 96.06669545173645, + "D": 0.39260261692106724 + }, + "correct": true, + "index": "chart_69", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 4.8997946083545685, + "B": 56.07518553733826, + "C": 38.53987455368042, + "D": 0.4851453937590122 + }, + "correct": false, + "index": "chart_70", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 25.434738397598267, + "B": 69.13877725601196, + "C": 4.704952985048294, + "D": 0.7215279154479504 + }, + "correct": false, + "index": "chart_71", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 14.364396035671234, + "B": 34.45839285850525, + "C": 50.136661529541016, + "D": 1.0405532084405422 + }, + "correct": true, + "index": "chart_72", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 2.6360224932432175, + "B": 46.72461152076721, + "C": 36.38916611671448, + "D": 14.250200986862183 + }, + "correct": false, + "index": "chart_73", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 3.653610125184059, + "B": 73.38472604751587, + "C": 18.55456382036209, + "D": 4.407095164060593 + }, + "correct": false, + "index": "chart_74", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 1.4898508787155151, + "B": 28.111425042152405, + "C": 67.43580102920532, + "D": 2.962922491133213 + }, + "correct": true, + "index": "chart_75", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.021959653531666845, + "B": 95.24491429328918, + "C": 2.8761472553014755, + "D": 1.856980286538601 + }, + "correct": false, + "index": "chart_76", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.7455069106072187, + "B": 11.661691218614578, + "C": 80.94817996025085, + "D": 6.644631177186966 + }, + "correct": false, + "index": "chart_77", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.21883896552026272, + "B": 4.678983613848686, + "C": 64.59137201309204, + "D": 30.510804057121277 + }, + "correct": false, + "index": "chart_78", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.3167758462950587, + "B": 0.058597640600055456, + "C": 99.52801465988159, + "D": 0.09661116637289524 + }, + "correct": true, + "index": "chart_79", + "category": "chart", + "answer": "C" + } + ], + "gptq_4bit": [ + { + "pred": "B", + "probs": { + "A": 20.479020476341248, + "B": 71.4788019657135, + "C": 6.648564338684082, + "D": 1.3936148956418037 + }, + "correct": true, + "index": "document_0", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 6.737218052148819, + "B": 34.21441614627838, + "C": 56.410038471221924, + "D": 2.6383327320218086 + }, + "correct": false, + "index": "document_1", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.11631405213847756, + "B": 0.4897004924714565, + "C": 99.3390440940857, + "D": 0.05494286888279021 + }, + "correct": true, + "index": "document_2", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 23.299646377563477, + "B": 55.8929443359375, + "C": 6.675460934638977, + "D": 14.131949841976166 + }, + "correct": true, + "index": "document_3", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.579003967344761, + "B": 97.68952131271362, + "C": 0.7006787694990635, + "D": 0.030785679700784385 + }, + "correct": false, + "index": "document_4", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.9967409074306488, + "B": 0.47082705423235893, + "C": 24.148820340633392, + "D": 74.38360452651978 + }, + "correct": true, + "index": "document_5", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 99.87890124320984, + "B": 0.08037585066631436, + "C": 0.037966863601468503, + "D": 0.002750310341070872 + }, + "correct": true, + "index": "document_6", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.3273067530244589, + "B": 24.425862729549408, + "C": 75.23695230484009, + "D": 0.009883807797450572 + }, + "correct": true, + "index": "document_7", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0009506212336418685, + "B": 0.10321977315470576, + "C": 99.89355206489563, + "D": 0.0022804219042882323 + }, + "correct": true, + "index": "document_8", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.9813973903656, + "B": 0.014883294352330267, + "C": 0.003320911491755396, + "D": 0.00039662636481807567 + }, + "correct": true, + "index": "document_9", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 2.0906388759613037, + "B": 7.7676646411418915, + "C": 73.69755506515503, + "D": 16.444148123264313 + }, + "correct": false, + "index": "document_10", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.680887047201395, + "B": 6.876715272665024, + "C": 65.244460105896, + "D": 27.197936177253723 + }, + "correct": false, + "index": "document_11", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 84.58335995674133, + "B": 14.698383212089539, + "C": 0.6458018906414509, + "D": 0.07245696615427732 + }, + "correct": false, + "index": "document_12", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 18.881988525390625, + "B": 74.67971444129944, + "C": 3.7180840969085693, + "D": 2.720208466053009 + }, + "correct": false, + "index": "document_13", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.016797146236058325, + "B": 68.43973994255066, + "C": 6.365887075662613, + "D": 25.177574157714844 + }, + "correct": false, + "index": "document_14", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.4650984425097704, + "B": 3.228422999382019, + "C": 94.34834718704224, + "D": 1.9581375643610954 + }, + "correct": true, + "index": "document_15", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.21469136700034142, + "B": 0.31237408984452486, + "C": 43.55158805847168, + "D": 55.921345949172974 + }, + "correct": true, + "index": "document_16", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 62.21088767051697, + "B": 37.7328097820282, + "C": 0.0532919482793659, + "D": 0.0030065262762946077 + }, + "correct": true, + "index": "document_17", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 1.9315892830491066, + "B": 2.810445986688137, + "C": 93.06918978691101, + "D": 2.1887775510549545 + }, + "correct": false, + "index": "document_18", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.22983215749263763, + "B": 98.70089888572693, + "C": 0.5179347936064005, + "D": 0.5513387266546488 + }, + "correct": true, + "index": "document_19", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 5.531888827681541, + "B": 2.306034415960312, + "C": 92.11422204971313, + "D": 0.04786021600011736 + }, + "correct": false, + "index": "document_20", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.16994375037029386, + "B": 0.05873098270967603, + "C": 99.75449442863464, + "D": 0.016826708451844752 + }, + "correct": true, + "index": "document_21", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.010228928294964135, + "B": 99.97944235801697, + "C": 0.009026998304761946, + "D": 0.001300462372455513 + }, + "correct": true, + "index": "document_22", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.001300510575674707, + "B": 0.013981806114315987, + "C": 99.98314380645752, + "D": 0.0015687151972088031 + }, + "correct": true, + "index": "document_23", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.009609511471353471, + "B": 99.98278617858887, + "C": 0.005828462963108905, + "D": 0.0017775810192688368 + }, + "correct": true, + "index": "document_24", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 17.445547878742218, + "B": 22.400526702404022, + "C": 53.73607277870178, + "D": 6.417858600616455 + }, + "correct": false, + "index": "document_25", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.004262438596924767, + "B": 0.02452864428050816, + "C": 99.94162321090698, + "D": 0.02958719269372523 + }, + "correct": true, + "index": "document_26", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.85287189483643, + "B": 0.09692651219666004, + "C": 0.0487377168610692, + "D": 0.0014717513295181561 + }, + "correct": true, + "index": "document_27", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 70.44975161552429, + "B": 25.917017459869385, + "C": 3.0953459441661835, + "D": 0.5378904286772013 + }, + "correct": true, + "index": "document_28", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 4.553039371967316, + "B": 3.545910492539406, + "C": 91.45023822784424, + "D": 0.45081195421516895 + }, + "correct": true, + "index": "document_29", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.72020387649536, + "B": 0.14083987334743142, + "C": 0.08024813723750412, + "D": 0.058710790472105145 + }, + "correct": true, + "index": "document_30", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.87983703613281, + "B": 0.08556044776923954, + "C": 0.03147593233734369, + "D": 0.003116539301117882 + }, + "correct": true, + "index": "document_31", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.007030304550426081, + "B": 0.0022824056941317394, + "C": 99.98045563697815, + "D": 0.010229031613562256 + }, + "correct": true, + "index": "document_32", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 14.69668596982956, + "B": 31.11288547515869, + "C": 2.8939493000507355, + "D": 51.29647254943848 + }, + "correct": true, + "index": "document_33", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 4.611984267830849, + "B": 92.63418316841125, + "C": 2.0465556532144547, + "D": 0.7072706706821918 + }, + "correct": true, + "index": "document_34", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.0007856115189497359, + "B": 0.03785288718063384, + "C": 0.3823006059974432, + "D": 99.57906603813171 + }, + "correct": true, + "index": "document_35", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.007482314686058089, + "B": 0.013978804054204375, + "C": 99.96167421340942, + "D": 0.016861656331457198 + }, + "correct": true, + "index": "document_36", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.4406034015119076, + "B": 95.1438307762146, + "C": 3.689126670360565, + "D": 0.7264320738613605 + }, + "correct": true, + "index": "document_37", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.10986194247379899, + "B": 99.87998008728027, + "C": 0.009018018317874521, + "D": 0.0011465122952358797 + }, + "correct": false, + "index": "document_38", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.060512294294312596, + "B": 3.303859382867813, + "C": 0.08271050173789263, + "D": 96.55292630195618 + }, + "correct": true, + "index": "document_39", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 8.247153460979462, + "B": 69.05256509780884, + "C": 22.418086230754852, + "D": 0.28220205567777157 + }, + "correct": false, + "index": "document_40", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.9718587622046471, + "B": 34.25920307636261, + "C": 43.98968517780304, + "D": 20.779258012771606 + }, + "correct": false, + "index": "document_41", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.22123507224023342, + "B": 7.326298207044601, + "C": 78.76513600349426, + "D": 13.6873260140419 + }, + "correct": false, + "index": "document_42", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.758151851594448, + "B": 97.22819924354553, + "C": 0.0127727776998654, + "D": 0.0008691983566677663 + }, + "correct": true, + "index": "document_43", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.00902714891708456, + "B": 99.98111128807068, + "C": 0.007966429984662682, + "D": 0.0018921929950010963 + }, + "correct": true, + "index": "document_44", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.0006776545887987595, + "B": 0.0735806708689779, + "C": 2.593808062374592, + "D": 97.33192920684814 + }, + "correct": false, + "index": "document_45", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 96.60395979881287, + "B": 0.07774039986543357, + "C": 3.305605798959732, + "D": 0.012690771836787462 + }, + "correct": false, + "index": "document_46", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 79.21786904335022, + "B": 8.349501341581345, + "C": 7.368408888578415, + "D": 5.0642285495996475 + }, + "correct": true, + "index": "document_47", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 98.29100966453552, + "B": 1.0257587768137455, + "C": 0.515783904120326, + "D": 0.16745052998885512 + }, + "correct": true, + "index": "document_48", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 89.21492099761963, + "B": 7.323206961154938, + "C": 2.530832588672638, + "D": 0.9310413151979446 + }, + "correct": false, + "index": "document_49", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.7880154997110367, + "B": 7.4764832854270935, + "C": 91.08221530914307, + "D": 0.6532877683639526 + }, + "correct": false, + "index": "document_50", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.5819022189825773, + "B": 0.3999351989477873, + "C": 1.1572507210075855, + "D": 97.86091446876526 + }, + "correct": true, + "index": "document_51", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 90.06575345993042, + "B": 2.895159088075161, + "C": 3.081880509853363, + "D": 3.9572130888700485 + }, + "correct": false, + "index": "document_52", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 26.89165472984314, + "B": 73.09908866882324, + "C": 0.00747879093978554, + "D": 0.0017763686628313735 + }, + "correct": true, + "index": "document_53", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 91.87570214271545, + "B": 5.183272808790207, + "C": 2.774405851960182, + "D": 0.16661601839587092 + }, + "correct": true, + "index": "document_54", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 7.1215614676475525, + "B": 86.75838112831116, + "C": 4.319445416331291, + "D": 1.8006127327680588 + }, + "correct": false, + "index": "document_55", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.9305993095040321, + "B": 89.17256593704224, + "C": 9.398718923330307, + "D": 0.49811392091214657 + }, + "correct": false, + "index": "document_56", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.4866700619459152, + "B": 98.72430562973022, + "C": 0.7537693250924349, + "D": 0.03525426145642996 + }, + "correct": true, + "index": "document_57", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 28.08680832386017, + "B": 28.08680832386017, + "C": 40.86606502532959, + "D": 2.9603278264403343 + }, + "correct": false, + "index": "document_58", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.06905736518092453, + "B": 0.2565792528912425, + "C": 97.24001288414001, + "D": 2.434356138110161 + }, + "correct": false, + "index": "document_59", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0005418563887360506, + "B": 0.06666937842965126, + "C": 99.93205070495605, + "D": 0.0007406299118883908 + }, + "correct": true, + "index": "document_60", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.11923208367079496, + "B": 95.66155672073364, + "C": 4.203075543045998, + "D": 0.016136307385750115 + }, + "correct": false, + "index": "document_61", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.4023300260305405, + "B": 98.31092953681946, + "C": 0.2594049787148833, + "D": 0.027341084205545485 + }, + "correct": true, + "index": "document_62", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 12.231648713350296, + "B": 6.547129154205322, + "C": 1.4608620665967464, + "D": 79.76036071777344 + }, + "correct": true, + "index": "document_63", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.829371392726898, + "B": 93.69590878486633, + "C": 2.496911399066448, + "D": 0.9778046049177647 + }, + "correct": false, + "index": "document_64", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.6274167448282242, + "B": 0.17975789960473776, + "C": 99.12242889404297, + "D": 0.07039420888759196 + }, + "correct": true, + "index": "document_65", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.026115996297448874, + "B": 99.96227025985718, + "C": 0.009025447798194364, + "D": 0.0025858342269202694 + }, + "correct": true, + "index": "document_66", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.0037631492887157947, + "B": 99.98307228088379, + "C": 0.010889034456340596, + "D": 0.002282465538883116 + }, + "correct": true, + "index": "document_67", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 97.75657653808594, + "B": 2.15972401201725, + "C": 0.07866794476285577, + "D": 0.005029073508922011 + }, + "correct": true, + "index": "document_68", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 95.96204161643982, + "B": 2.5573017075657845, + "C": 1.457106601446867, + "D": 0.02355193573748693 + }, + "correct": true, + "index": "document_69", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.0005053897439211141, + "B": 0.5899717099964619, + "C": 0.19153577741235495, + "D": 99.21798706054688 + }, + "correct": true, + "index": "document_70", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.008478081872453913, + "B": 0.021649539121426642, + "C": 99.95588660240173, + "D": 0.013977994967717677 + }, + "correct": true, + "index": "document_71", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 2.4034040048718452, + "B": 96.00362777709961, + "C": 1.369418203830719, + "D": 0.22355136461555958 + }, + "correct": true, + "index": "document_72", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 47.67071008682251, + "B": 42.06925332546234, + "C": 9.386918693780899, + "D": 0.8731194771826267 + }, + "correct": true, + "index": "document_73", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.65680837631226, + "B": 0.13222270645201206, + "C": 0.204790523275733, + "D": 0.006184137600939721 + }, + "correct": true, + "index": "document_74", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.009571416740072891, + "B": 25.179395079612732, + "C": 6.366347521543503, + "D": 68.44468712806702 + }, + "correct": true, + "index": "document_75", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.07082877564243972, + "B": 99.73434805870056, + "C": 0.13232558267191052, + "D": 0.06250617443583906 + }, + "correct": true, + "index": "document_76", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.98972415924072, + "B": 0.005143957605469041, + "C": 0.004832301056012511, + "D": 0.0003089186520810472 + }, + "correct": true, + "index": "document_77", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 2.0573457702994347, + "B": 38.819268345832825, + "C": 56.481701135635376, + "D": 2.641684375703335 + }, + "correct": true, + "index": "document_78", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 4.73206453025341, + "B": 0.03845992323476821, + "C": 83.87784361839294, + "D": 11.351631581783295 + }, + "correct": false, + "index": "document_79", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.29151029884815216, + "B": 86.04066967964172, + "C": 11.644338071346283, + "D": 2.023482508957386 + }, + "correct": false, + "index": "table_0", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 42.16877222061157, + "B": 42.16877222061157, + "C": 13.690195977687836, + "D": 1.9722599536180496 + }, + "correct": true, + "index": "table_1", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 98.54714870452881, + "B": 1.1653658002614975, + "C": 0.22947413381189108, + "D": 0.05802015075460076 + }, + "correct": true, + "index": "table_2", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.05148001364432275, + "B": 99.08106327056885, + "C": 0.5891575012356043, + "D": 0.27829832397401333 + }, + "correct": true, + "index": "table_3", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.16388383228331804, + "B": 2.904910407960415, + "C": 51.49076581001282, + "D": 45.440441370010376 + }, + "correct": true, + "index": "table_4", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.011546886526048183, + "B": 0.0908232934307307, + "C": 0.29779812321066856, + "D": 99.59983825683594 + }, + "correct": true, + "index": "table_5", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 6.837794929742813, + "B": 53.78342866897583, + "C": 28.788194060325623, + "D": 10.590583831071854 + }, + "correct": false, + "index": "table_6", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.120516821742058, + "B": 1.5514032915234566, + "C": 95.98192572593689, + "D": 0.34616487100720406 + }, + "correct": false, + "index": "table_7", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.06612500292249024, + "B": 99.11608099937439, + "C": 0.8055674843490124, + "D": 0.01223189610755071 + }, + "correct": true, + "index": "table_8", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.797473222017288, + "B": 87.02683448791504, + "C": 4.612253233790398, + "D": 5.563439056277275 + }, + "correct": true, + "index": "table_9", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 5.995703861117363, + "B": 64.459890127182, + "C": 19.65915560722351, + "D": 9.885244816541672 + }, + "correct": false, + "index": "table_10", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 23.509639501571655, + "B": 43.92178654670715, + "C": 20.74718326330185, + "D": 11.821388453245163 + }, + "correct": true, + "index": "table_11", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.56113500893116, + "B": 38.28580975532532, + "C": 55.70552349090576, + "D": 2.4475298821926117 + }, + "correct": false, + "index": "table_12", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.35879702772945166, + "B": 99.48446750640869, + "C": 0.11648433282971382, + "D": 0.040255908970721066 + }, + "correct": false, + "index": "table_13", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 3.375784307718277, + "B": 43.77783536911011, + "C": 38.63380253314972, + "D": 14.212581515312195 + }, + "correct": false, + "index": "table_14", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 14.612403512001038, + "B": 74.20791387557983, + "C": 9.434476494789124, + "D": 1.7452029511332512 + }, + "correct": false, + "index": "table_15", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 19.071368873119354, + "B": 58.743953704833984, + "C": 19.071368873119354, + "D": 3.1133154407143593 + }, + "correct": true, + "index": "table_16", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 36.83236539363861, + "B": 53.59077453613281, + "C": 9.31267961859703, + "D": 0.2641804050654173 + }, + "correct": true, + "index": "table_17", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.048593353130854666, + "B": 0.09663940872997046, + "C": 99.55710768699646, + "D": 0.2976703690364957 + }, + "correct": true, + "index": "table_18", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 1.2560655362904072, + "B": 10.516908019781113, + "C": 68.57885718345642, + "D": 19.648171961307526 + }, + "correct": false, + "index": "table_19", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 3.254557028412819, + "B": 44.927772879600525, + "C": 44.927772879600525, + "D": 6.889896839857101 + }, + "correct": false, + "index": "table_20", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.5040785074234009, + "B": 93.05404424667358, + "C": 3.840799257159233, + "D": 1.6010832041502 + }, + "correct": true, + "index": "table_21", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.24646585807204247, + "B": 99.43141341209412, + "C": 0.042829339508898556, + "D": 0.2792824059724808 + }, + "correct": true, + "index": "table_22", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 81.16628527641296, + "B": 2.45100948959589, + "C": 15.98258912563324, + "D": 0.40011629462242126 + }, + "correct": true, + "index": "table_23", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.012325220450293273, + "B": 99.87229704856873, + "C": 0.06662951782345772, + "D": 0.048747198889032006 + }, + "correct": true, + "index": "table_24", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.0605525157880038, + "B": 3.3060554414987564, + "C": 96.61710262298584, + "D": 0.016297488764394075 + }, + "correct": true, + "index": "table_25", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.3068803111091256, + "B": 48.48248362541199, + "C": 42.78564155101776, + "D": 8.424991369247437 + }, + "correct": false, + "index": "table_26", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.5532787665724754, + "B": 61.86027526855469, + "C": 31.105300784111023, + "D": 4.48114350438118 + }, + "correct": false, + "index": "table_27", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.000741082976674079, + "B": 0.003321302938275039, + "C": 99.9931812286377, + "D": 0.0027534573746379465 + }, + "correct": true, + "index": "table_28", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.40568080730736256, + "B": 0.2311499323695898, + "C": 99.26682114601135, + "D": 0.09635763126425445 + }, + "correct": true, + "index": "table_29", + "category": "table", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 69.50779557228088, + "B": 28.97515892982483, + "C": 1.35518629103899, + "D": 0.16185390995815396 + }, + "correct": true, + "index": "table_30", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.24611183907836676, + "B": 99.28860068321228, + "C": 0.3160138614475727, + "D": 0.14927437296137214 + }, + "correct": true, + "index": "table_31", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.008412683382630348, + "B": 0.5897746421396732, + "C": 0.21696598269045353, + "D": 99.18484687805176 + }, + "correct": true, + "index": "table_32", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.09098359732888639, + "B": 0.07085809484124184, + "C": 99.775630235672, + "D": 0.0625320477411151 + }, + "correct": true, + "index": "table_33", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 5.5885277688503265, + "B": 4.352349787950516, + "C": 87.41928935050964, + "D": 2.639833837747574 + }, + "correct": true, + "index": "table_34", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 29.089394211769104, + "B": 69.78183388710022, + "C": 0.8252025581896305, + "D": 0.303575093857944 + }, + "correct": false, + "index": "table_35", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 97.8991687297821, + "B": 0.9016201831400394, + "C": 0.17753953579813242, + "D": 1.0216696187853813 + }, + "correct": true, + "index": "table_36", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 5.1245588809251785, + "B": 12.293177843093872, + "C": 80.16158938407898, + "D": 2.4206701666116714 + }, + "correct": false, + "index": "table_37", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 9.952744841575623, + "B": 83.33331346511841, + "C": 6.036645174026489, + "D": 0.6772928405553102 + }, + "correct": true, + "index": "table_38", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.03170489217154682, + "B": 94.51095461845398, + "C": 5.331943556666374, + "D": 0.12539528543129563 + }, + "correct": false, + "index": "table_39", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 54.73228096961975, + "B": 33.19680690765381, + "C": 9.51104387640953, + "D": 2.559863030910492 + }, + "correct": true, + "index": "table_40", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 13.813203573226929, + "B": 51.32228136062622, + "C": 27.47083604335785, + "D": 7.393675297498703 + }, + "correct": true, + "index": "table_41", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.11428982252255082, + "B": 20.460215210914612, + "C": 71.41316533088684, + "D": 8.012334257364273 + }, + "correct": true, + "index": "table_42", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.005280494588078, + "B": 6.984996795654297, + "C": 85.09467840194702, + "D": 7.9150378704071045 + }, + "correct": false, + "index": "table_43", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.13590820599347353, + "B": 2.263074927031994, + "C": 96.22839093208313, + "D": 1.3726241886615753 + }, + "correct": false, + "index": "table_44", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 75.42039752006531, + "B": 24.48541820049286, + "C": 0.08295787847600877, + "D": 0.011227128561586142 + }, + "correct": false, + "index": "table_45", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.0037612593587255105, + "B": 99.932861328125, + "C": 0.043045333586633205, + "D": 0.020333175780251622 + }, + "correct": true, + "index": "table_46", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 4.431784152984619, + "B": 89.01476263999939, + "C": 5.0218697637319565, + "D": 1.5315835364162922 + }, + "correct": false, + "index": "table_47", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 5.655099079012871, + "B": 53.65408658981323, + "C": 28.718966245651245, + "D": 11.971845477819443 + }, + "correct": false, + "index": "table_48", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 21.494516730308533, + "B": 75.02323389053345, + "C": 3.296290710568428, + "D": 0.18596401205286384 + }, + "correct": false, + "index": "table_49", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 89.18829560279846, + "B": 9.400377422571182, + "C": 0.6397036835551262, + "D": 0.7716299500316381 + }, + "correct": true, + "index": "table_50", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.591355562210083, + "B": 44.13098990917206, + "C": 50.006961822509766, + "D": 5.270694941282272 + }, + "correct": true, + "index": "table_51", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.35791557747870684, + "B": 99.24006462097168, + "C": 0.2618566155433655, + "D": 0.14016175409778953 + }, + "correct": true, + "index": "table_52", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.011579268175410107, + "B": 99.8791515827179, + "C": 0.09695201297290623, + "D": 0.01232606591656804 + }, + "correct": true, + "index": "table_53", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 29.473471641540527, + "B": 45.64940631389618, + "C": 17.87656396627426, + "D": 7.00056329369545 + }, + "correct": true, + "index": "table_54", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 18.24798285961151, + "B": 76.82687640190125, + "C": 4.0716752409935, + "D": 0.8534695021808147 + }, + "correct": false, + "index": "table_55", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 7.650177180767059, + "B": 72.58285880088806, + "C": 18.35182160139084, + "D": 1.4151405543088913 + }, + "correct": false, + "index": "table_56", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0486960110720247, + "B": 0.14090656768530607, + "C": 99.7674286365509, + "D": 0.04297407576814294 + }, + "correct": true, + "index": "table_57", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 29.14949655532837, + "B": 69.92601156234741, + "C": 0.39060350973159075, + "D": 0.5338916555047035 + }, + "correct": false, + "index": "table_58", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.004260929563315585, + "B": 0.07552678580395877, + "C": 99.90623593330383, + "D": 0.0139710507937707 + }, + "correct": true, + "index": "table_59", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 6.55217170715332, + "B": 54.86065745353699, + "C": 15.717843174934387, + "D": 22.869324684143066 + }, + "correct": false, + "index": "table_60", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.07993564358912408, + "B": 0.5548633635044098, + "C": 99.33187961578369, + "D": 0.033322133822366595 + }, + "correct": true, + "index": "table_61", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0024298467906191945, + "B": 0.003535406358423643, + "C": 99.99027252197266, + "D": 0.003763420318136923 + }, + "correct": true, + "index": "table_62", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.004040703424834646, + "B": 0.36373252514749765, + "C": 10.629822313785553, + "D": 89.00241255760193 + }, + "correct": true, + "index": "table_63", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 6.5659381449222565, + "B": 33.344584703445435, + "C": 54.97592091560364, + "D": 5.113557353615761 + }, + "correct": true, + "index": "table_64", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.0771074031945318, + "B": 1.9886260852217674, + "C": 95.81737518310547, + "D": 2.1168814972043037 + }, + "correct": true, + "index": "table_65", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.7689273916184902, + "B": 94.60791945457458, + "C": 4.156782105565071, + "D": 0.4663779865950346 + }, + "correct": true, + "index": "table_66", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.50927495956421, + "B": 0.13202695408836007, + "C": 0.33714266028255224, + "D": 0.021552806720137596 + }, + "correct": true, + "index": "table_67", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 99.95030164718628, + "B": 0.012334846542216837, + "C": 0.035692061646841466, + "D": 0.0016693400539224967 + }, + "correct": true, + "index": "table_68", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.0024296543415402994, + "B": 99.98236298561096, + "C": 0.013981696974951774, + "D": 0.0012217069524922408 + }, + "correct": true, + "index": "table_69", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.02608227077871561, + "B": 0.08552048238925636, + "C": 0.05521617131307721, + "D": 99.83318448066711 + }, + "correct": true, + "index": "table_70", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 49.6432363986969, + "B": 49.6432363986969, + "C": 0.379030779004097, + "D": 0.3344935132190585 + }, + "correct": true, + "index": "table_71", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 18.294227123260498, + "B": 56.350189447402954, + "C": 20.73007822036743, + "D": 4.625505208969116 + }, + "correct": true, + "index": "table_72", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 10.007872432470322, + "B": 65.25952219963074, + "C": 24.007639288902283, + "D": 0.7249678950756788 + }, + "correct": true, + "index": "table_73", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 96.88435792922974, + "B": 2.0107707008719444, + "C": 0.949820876121521, + "D": 0.15505398623645306 + }, + "correct": false, + "index": "table_74", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.6395172793418169, + "B": 94.91277933120728, + "C": 3.457197919487953, + "D": 0.9905038401484489 + }, + "correct": true, + "index": "table_75", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.04579384403768927, + "B": 99.87249970436096, + "C": 0.07550128502771258, + "D": 0.006197522452566773 + }, + "correct": true, + "index": "table_76", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 3.7361804395914078, + "B": 85.03507375717163, + "C": 8.962630480527878, + "D": 2.2661078721284866 + }, + "correct": false, + "index": "table_77", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.3460950702428818, + "B": 68.56294870376587, + "C": 25.22290050983429, + "D": 3.868056833744049 + }, + "correct": true, + "index": "table_78", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.6676351428031921, + "B": 4.533102363348007, + "C": 91.04979634284973, + "D": 2.7494655922055244 + }, + "correct": false, + "index": "table_79", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 4.576856270432472, + "B": 86.35894060134888, + "C": 8.550693094730377, + "D": 0.5135090090334415 + }, + "correct": false, + "index": "chart_0", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 5.516251921653748, + "B": 24.722126126289368, + "C": 35.970479249954224, + "D": 33.79113972187042 + }, + "correct": false, + "index": "chart_1", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.2953429939225316, + "B": 98.77870678901672, + "C": 0.802825577557087, + "D": 0.12311728205531836 + }, + "correct": true, + "index": "chart_2", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 2.557782642543316, + "B": 42.590904235839844, + "C": 54.687803983688354, + "D": 0.16351357335224748 + }, + "correct": false, + "index": "chart_3", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.3822873579338193, + "B": 99.57560896873474, + "C": 0.037851574597880244, + "D": 0.004246828393661417 + }, + "correct": true, + "index": "chart_4", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.013959604257252067, + "B": 99.82438087463379, + "C": 0.15007988549768925, + "D": 0.011572918447200209 + }, + "correct": true, + "index": "chart_5", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 5.099005624651909, + "B": 66.12491011619568, + "C": 27.564963698387146, + "D": 1.2111200019717216 + }, + "correct": false, + "index": "chart_6", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 6.05408102273941, + "B": 73.75380396842957, + "C": 19.85056698322296, + "D": 0.3415479091927409 + }, + "correct": false, + "index": "chart_7", + "category": "chart", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 83.94249677658081, + "B": 14.587017893791199, + "C": 1.0566800832748413, + "D": 0.41380184702575207 + }, + "correct": false, + "index": "chart_8", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 34.180036187171936, + "B": 63.856714963912964, + "C": 1.4107785187661648, + "D": 0.5524688400328159 + }, + "correct": true, + "index": "chart_9", + "category": "chart", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.007694232044741511, + "B": 1.2939710170030594, + "C": 2.1333973854780197, + "D": 96.5649425983429 + }, + "correct": true, + "index": "chart_10", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 14.005585014820099, + "B": 75.7134735584259, + "C": 9.625887870788574, + "D": 0.6550499238073826 + }, + "correct": true, + "index": "chart_11", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.7282923683524132, + "B": 83.2737922668457, + "C": 14.470814168453217, + "D": 0.5270993802696466 + }, + "correct": true, + "index": "chart_12", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.004537100539891981, + "B": 0.029585612355731428, + "C": 99.93628859519958, + "D": 0.029585612355731428 + }, + "correct": true, + "index": "chart_13", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 99.5762288570404, + "B": 0.3591279499232769, + "C": 0.05507405148819089, + "D": 0.0095704359409865 + }, + "correct": true, + "index": "chart_14", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.5024055019021034, + "B": 89.94085192680359, + "C": 9.479695558547974, + "D": 0.07704637828283012 + }, + "correct": true, + "index": "chart_15", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.017888113507069647, + "B": 0.2978638280183077, + "C": 99.62181448936462, + "D": 0.06243564421311021 + }, + "correct": true, + "index": "chart_16", + "category": "chart", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.15937084099277854, + "B": 4.957881197333336, + "C": 1.3343955390155315, + "D": 93.54835152626038 + }, + "correct": true, + "index": "chart_17", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 13.367971777915955, + "B": 76.92736983299255, + "C": 8.10808464884758, + "D": 1.5965765342116356 + }, + "correct": true, + "index": "chart_18", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 12.180602550506592, + "B": 54.58967089653015, + "C": 33.11030864715576, + "D": 0.11941442498937249 + }, + "correct": true, + "index": "chart_19", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.4707054495811462, + "B": 22.631843388080597, + "C": 69.71098780632019, + "D": 4.186470061540604 + }, + "correct": true, + "index": "chart_20", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 31.840986013412476, + "B": 59.48679447174072, + "C": 5.88999018073082, + "D": 2.7822345495224 + }, + "correct": false, + "index": "chart_21", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 6.308987736701965, + "B": 72.20253944396973, + "C": 20.686374604701996, + "D": 0.8020978420972824 + }, + "correct": true, + "index": "chart_22", + "category": "chart", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.28178787231445, + "B": 0.6689554080367088, + "C": 0.03773988282773644, + "D": 0.011510014155646786 + }, + "correct": true, + "index": "chart_23", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.8090054616332054, + "B": 60.3735089302063, + "C": 36.61838471889496, + "D": 2.1991049870848656 + }, + "correct": false, + "index": "chart_24", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.8437357619404793, + "B": 73.64776134490967, + "C": 23.909926414489746, + "D": 0.5985733587294817 + }, + "correct": false, + "index": "chart_25", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.19539606291800737, + "B": 8.844301104545593, + "C": 89.32427763938904, + "D": 1.6360312700271606 + }, + "correct": false, + "index": "chart_26", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 67.74358749389648, + "B": 31.999805569648743, + "C": 0.14818849740549922, + "D": 0.10841703042387962 + }, + "correct": false, + "index": "chart_27", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.02304796944372356, + "B": 99.96522665023804, + "C": 0.007965164695633575, + "D": 0.003762477354030125 + }, + "correct": true, + "index": "chart_28", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.005398389475885779, + "B": 98.57773184776306, + "C": 1.4061357825994492, + "D": 0.010735979594755918 + }, + "correct": true, + "index": "chart_29", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 7.380379736423492, + "B": 84.46397185325623, + "C": 3.950432687997818, + "D": 4.205213487148285 + }, + "correct": false, + "index": "chart_30", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 4.653273895382881, + "B": 20.85452824831009, + "C": 44.14903521537781, + "D": 30.343160033226013 + }, + "correct": true, + "index": "chart_31", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.31544638331979513, + "B": 0.35744758788496256, + "C": 99.11030530929565, + "D": 0.21680290810763836 + }, + "correct": true, + "index": "chart_32", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 98.65395426750183, + "B": 1.166628859937191, + "C": 0.1483202213421464, + "D": 0.031089611002244055 + }, + "correct": true, + "index": "chart_33", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.6740888115018606, + "B": 88.28821778297424, + "C": 10.54452434182167, + "D": 0.4931739531457424 + }, + "correct": false, + "index": "chart_34", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 29.415446519851685, + "B": 70.5639898777008, + "C": 0.01528352004243061, + "D": 0.00528184391441755 + }, + "correct": true, + "index": "chart_35", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 9.657185524702072, + "B": 43.280503153800964, + "C": 43.280503153800964, + "D": 3.781808167695999 + }, + "correct": false, + "index": "chart_36", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.966194972395897, + "B": 49.39158260822296, + "C": 43.58791708946228, + "D": 4.05430793762207 + }, + "correct": false, + "index": "chart_37", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.6839399710297585, + "B": 83.4949254989624, + "C": 11.299809068441391, + "D": 2.521328255534172 + }, + "correct": true, + "index": "chart_38", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.19268764881417155, + "B": 5.994337052106857, + "C": 93.76721382141113, + "D": 0.04576733335852623 + }, + "correct": true, + "index": "chart_39", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 64.40905928611755, + "B": 26.849690079689026, + "C": 7.226495444774628, + "D": 1.5147559344768524 + }, + "correct": true, + "index": "chart_40", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.31659468077123165, + "B": 77.46816277503967, + "C": 22.19500094652176, + "D": 0.020239218429196626 + }, + "correct": true, + "index": "chart_41", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.5965765342116356, + "B": 76.92736983299255, + "C": 8.10808464884758, + "D": 13.367971777915955 + }, + "correct": false, + "index": "chart_42", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.05498891114257276, + "B": 0.062310596695169806, + "C": 99.42228198051453, + "D": 0.4604165442287922 + }, + "correct": true, + "index": "chart_43", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 5.058497190475464, + "B": 57.89143443107605, + "C": 24.13274049758911, + "D": 12.917326390743256 + }, + "correct": false, + "index": "chart_44", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 9.710899740457535, + "B": 81.30837082862854, + "C": 6.674197316169739, + "D": 2.3065410554409027 + }, + "correct": false, + "index": "chart_45", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 1.4729510992765427, + "B": 58.83682370185852, + "C": 35.68633496761322, + "D": 4.003895819187164 + }, + "correct": false, + "index": "chart_46", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.8376635611057281, + "B": 96.82074189186096, + "C": 2.277005650103092, + "D": 0.06459367577917874 + }, + "correct": false, + "index": "chart_47", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.22056044545024633, + "B": 19.854217767715454, + "C": 69.29802894592285, + "D": 10.627197474241257 + }, + "correct": false, + "index": "chart_48", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 99.54389929771423, + "B": 0.297630880959332, + "C": 0.1405908726155758, + "D": 0.017874121840577573 + }, + "correct": true, + "index": "chart_49", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 9.325840324163437, + "B": 53.666508197784424, + "C": 34.64970290660858, + "D": 2.3579418659210205 + }, + "correct": false, + "index": "chart_50", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 10.724394768476486, + "B": 10.074635595083237, + "C": 74.44204688072205, + "D": 4.758920893073082 + }, + "correct": false, + "index": "chart_51", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 6.0340095311403275, + "B": 83.29693078994751, + "C": 9.948399662971497, + "D": 0.7206596434116364 + }, + "correct": true, + "index": "chart_52", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.20497443620115519, + "B": 99.74629878997803, + "C": 0.03561921475920826, + "D": 0.013103577657602727 + }, + "correct": true, + "index": "chart_53", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.7498388439416885, + "B": 31.3970148563385, + "C": 51.764923334121704, + "D": 13.088221848011017 + }, + "correct": false, + "index": "chart_54", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 5.099616199731827, + "B": 84.91623401641846, + "C": 7.419897615909576, + "D": 2.5642480701208115 + }, + "correct": true, + "index": "chart_55", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.517097234725952, + "B": 19.01324689388275, + "C": 75.19885301589966, + "D": 2.270808629691601 + }, + "correct": false, + "index": "chart_56", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.005809379581478424, + "B": 99.65542554855347, + "C": 0.31718139071017504, + "D": 0.021584461501333863 + }, + "correct": true, + "index": "chart_57", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.014546998136211187, + "B": 15.952719748020172, + "C": 52.30695605278015, + "D": 31.725773215293884 + }, + "correct": false, + "index": "chart_58", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.548276260495186, + "B": 95.62336206436157, + "C": 1.7514029517769814, + "D": 0.0769512727856636 + }, + "correct": false, + "index": "chart_59", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 7.313825935125351, + "B": 16.48196280002594, + "C": 57.52769708633423, + "D": 18.676508963108063 + }, + "correct": false, + "index": "chart_60", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 23.35650771856308, + "B": 63.48956227302551, + "C": 10.364386439323425, + "D": 2.78953667730093 + }, + "correct": true, + "index": "chart_61", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.0144522190093994, + "B": 80.46700358390808, + "C": 13.983067870140076, + "D": 3.535473346710205 + }, + "correct": false, + "index": "chart_62", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.010876784654101357, + "B": 0.043018514406867325, + "C": 99.87059831619263, + "D": 0.07549984729848802 + }, + "correct": true, + "index": "chart_63", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.5707485377788544, + "B": 91.29101634025574, + "C": 5.836039036512375, + "D": 1.3021963648498058 + }, + "correct": false, + "index": "chart_64", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 0.040048686787486076, + "B": 98.97235631942749, + "C": 0.8562786504626274, + "D": 0.1313145854510367 + }, + "correct": true, + "index": "chart_65", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 3.0144741758704185, + "B": 50.19550323486328, + "C": 39.09229636192322, + "D": 7.697729766368866 + }, + "correct": false, + "index": "chart_66", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 7.249471545219421, + "B": 73.21706414222717, + "C": 12.7232164144516, + "D": 6.810247898101807 + }, + "correct": true, + "index": "chart_67", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 5.160941928625107, + "B": 80.73071837425232, + "C": 7.054171711206436, + "D": 7.054171711206436 + }, + "correct": false, + "index": "chart_68", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 5.016941949725151, + "B": 15.453268587589264, + "C": 78.4781813621521, + "D": 1.0516081936657429 + }, + "correct": true, + "index": "chart_69", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 26.11554265022278, + "B": 62.64793276786804, + "C": 10.886576771736145, + "D": 0.34994848538190126 + }, + "correct": false, + "index": "chart_70", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 69.5751965045929, + "B": 29.00325655937195, + "C": 1.056443527340889, + "D": 0.365097145549953 + }, + "correct": true, + "index": "chart_71", + "category": "chart", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 37.06830143928528, + "B": 32.71266222000122, + "C": 28.868824243545532, + "D": 1.3502128422260284 + }, + "correct": false, + "index": "chart_72", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 5.706780403852463, + "B": 54.14442420005798, + "C": 25.576016306877136, + "D": 14.57277536392212 + }, + "correct": false, + "index": "chart_73", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.8171502277255058, + "B": 87.55520582199097, + "C": 8.143902570009232, + "D": 2.4837499484419823 + }, + "correct": false, + "index": "chart_74", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 8.443932980298996, + "B": 48.591482639312744, + "C": 37.84308433532715, + "D": 5.12150451540947 + }, + "correct": false, + "index": "chart_75", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 0.022578601783607155, + "B": 97.92945981025696, + "C": 1.0878981091082096, + "D": 0.9600666351616383 + }, + "correct": false, + "index": "chart_76", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 4.812972620129585, + "B": 17.882362008094788, + "C": 70.72611451148987, + "D": 6.578553467988968 + }, + "correct": false, + "index": "chart_77", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 5.322026461362839, + "B": 64.83555436134338, + "C": 18.575698137283325, + "D": 11.26672849059105 + }, + "correct": false, + "index": "chart_78", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.271442674100399, + "B": 0.8895096369087696, + "C": 96.58419489860535, + "D": 0.2548488089814782 + }, + "correct": true, + "index": "chart_79", + "category": "chart", + "answer": "C" + } + ], + "foem_3bit": [ + { + "pred": "B", + "probs": { + "A": 26.87678337097168, + "B": 64.47405219078064, + "C": 5.633679777383804, + "D": 3.0154917389154434 + }, + "correct": true, + "index": "document_0", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 18.293730914592743, + "B": 16.14416092634201, + "C": 59.98283624649048, + "D": 5.579272657632828 + }, + "correct": false, + "index": "document_1", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.972841028124094, + "B": 2.1923309192061424, + "C": 93.22028160095215, + "D": 3.614542633295059 + }, + "correct": true, + "index": "document_2", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 17.63443499803543, + "B": 24.10341650247574, + "C": 30.94939887523651, + "D": 27.31274962425232 + }, + "correct": false, + "index": "document_3", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.529766596853733, + "B": 69.45138573646545, + "C": 27.197551727294922, + "D": 0.8212949149310589 + }, + "correct": false, + "index": "document_4", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 13.18856030702591, + "B": 8.515173941850662, + "C": 19.189240038394928, + "D": 59.10702347755432 + }, + "correct": true, + "index": "document_5", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 90.62358140945435, + "B": 3.9817221462726593, + "C": 3.51385734975338, + "D": 1.880832388997078 + }, + "correct": true, + "index": "document_6", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 2.9541093856096268, + "B": 20.50558477640152, + "C": 76.18748545646667, + "D": 0.3528180764988065 + }, + "correct": true, + "index": "document_7", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.023242719180416316, + "B": 10.625287145376205, + "C": 88.96443843841553, + "D": 0.3870260436087847 + }, + "correct": true, + "index": "document_8", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 91.7463481426239, + "B": 7.5309984385967255, + "C": 0.5455437116324902, + "D": 0.17711211694404483 + }, + "correct": true, + "index": "document_9", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 7.156785577535629, + "B": 13.370636105537415, + "C": 26.590684056282043, + "D": 52.881890535354614 + }, + "correct": true, + "index": "document_10", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.717086486518383, + "B": 3.9533372968435287, + "C": 58.09386968612671, + "D": 35.23571193218231 + }, + "correct": false, + "index": "document_11", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 17.54172593355179, + "B": 78.61655950546265, + "C": 3.454170748591423, + "D": 0.38754718843847513 + }, + "correct": true, + "index": "document_12", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 14.166538417339325, + "B": 63.49002122879028, + "C": 21.941564977169037, + "D": 0.4018737468868494 + }, + "correct": false, + "index": "document_13", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 3.8908980786800385, + "B": 60.86388826370239, + "C": 8.237031102180481, + "D": 27.008187770843506 + }, + "correct": false, + "index": "document_14", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 55.603498220443726, + "B": 20.455385744571686, + "C": 8.010444045066833, + "D": 15.930669009685516 + }, + "correct": false, + "index": "document_15", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 14.340336620807648, + "B": 25.168076157569885, + "C": 7.210773974657059, + "D": 53.28081250190735 + }, + "correct": true, + "index": "document_16", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 28.801998496055603, + "B": 64.90630507469177, + "C": 3.4399081021547318, + "D": 2.8517842292785645 + }, + "correct": false, + "index": "document_17", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 26.651272177696228, + "B": 23.519665002822876, + "C": 36.42796874046326, + "D": 13.401103019714355 + }, + "correct": false, + "index": "document_18", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 12.472212314605713, + "B": 81.32903575897217, + "C": 1.314561441540718, + "D": 4.884188249707222 + }, + "correct": true, + "index": "document_19", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 3.31130251288414, + "B": 7.462134957313538, + "C": 80.22550940513611, + "D": 9.001052379608154 + }, + "correct": false, + "index": "document_20", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 1.1292503215372562, + "B": 2.2457826882600784, + "C": 89.70746397972107, + "D": 6.917496770620346 + }, + "correct": true, + "index": "document_21", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.7840128391981125, + "B": 97.40380048751831, + "C": 0.6563016213476658, + "D": 0.1558853080496192 + }, + "correct": true, + "index": "document_22", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.04024943627882749, + "B": 0.4327222239226103, + "C": 99.46847558021545, + "D": 0.058562582125887275 + }, + "correct": true, + "index": "document_23", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.4834418892860413, + "B": 97.69642949104309, + "C": 0.2744091674685478, + "D": 0.5457277875393629 + }, + "correct": true, + "index": "document_24", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 36.105987429618835, + "B": 8.5759237408638, + "C": 52.53390073776245, + "D": 2.7841947972774506 + }, + "correct": false, + "index": "document_25", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.03974639403168112, + "B": 1.4914724044501781, + "C": 98.22530746459961, + "D": 0.24347619619220495 + }, + "correct": true, + "index": "document_26", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 90.11281132698059, + "B": 8.922377228736877, + "C": 0.7796285673975945, + "D": 0.18517801072448492 + }, + "correct": true, + "index": "document_27", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 14.988823235034943, + "B": 35.95631718635559, + "C": 29.808834195137024, + "D": 19.2460298538208 + }, + "correct": false, + "index": "document_28", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 39.591702818870544, + "B": 50.836753845214844, + "C": 8.298871666193008, + "D": 1.2726732529699802 + }, + "correct": false, + "index": "document_29", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 16.067631542682648, + "B": 17.103905975818634, + "C": 7.129968702793121, + "D": 59.69849228858948 + }, + "correct": false, + "index": "document_30", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 93.85656714439392, + "B": 5.295025557279587, + "C": 0.7628207560628653, + "D": 0.08558611152693629 + }, + "correct": true, + "index": "document_31", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.748600997030735, + "B": 0.11480168905109167, + "C": 98.04738759994507, + "D": 1.0892082005739212 + }, + "correct": true, + "index": "document_32", + "category": "document", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 4.302016645669937, + "B": 2.0321285352110863, + "C": 1.684693805873394, + "D": 91.98116660118103 + }, + "correct": true, + "index": "document_33", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 14.186662435531616, + "B": 34.032031893730164, + "C": 43.69799494743347, + "D": 8.083316683769226 + }, + "correct": false, + "index": "document_34", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 1.156228594481945, + "B": 0.2746284008026123, + "C": 0.7946636527776718, + "D": 97.77447581291199 + }, + "correct": true, + "index": "document_35", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.13070623390376568, + "B": 1.2401062063872814, + "C": 98.51383566856384, + "D": 0.11534783989191055 + }, + "correct": true, + "index": "document_36", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 26.02621614933014, + "B": 66.46026968955994, + "C": 3.9912495762109756, + "D": 3.5222653299570084 + }, + "correct": true, + "index": "document_37", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.1546870800666511, + "B": 96.65510058403015, + "C": 0.2714843023568392, + "D": 2.9187310487031937 + }, + "correct": false, + "index": "document_38", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 0.46356390230357647, + "B": 1.6179969534277916, + "C": 3.881373256444931, + "D": 94.03706192970276 + }, + "correct": true, + "index": "document_39", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 11.531861126422882, + "B": 80.04698157310486, + "C": 5.117231979966164, + "D": 3.3039335161447525 + }, + "correct": false, + "index": "document_40", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 1.4152944087982178, + "B": 53.10853123664856, + "C": 15.215849876403809, + "D": 30.260327458381653 + }, + "correct": true, + "index": "document_41", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 2.372419834136963, + "B": 30.766010284423828, + "C": 57.47846961021423, + "D": 9.383102506399155 + }, + "correct": false, + "index": "document_42", + "category": "document", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 59.199196100234985, + "B": 40.68697392940521, + "C": 0.0631121511105448, + "D": 0.05071203340776265 + }, + "correct": false, + "index": "document_43", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 4.140149429440498, + "B": 94.2293643951416, + "C": 0.8152437396347523, + "D": 0.8152437396347523 + }, + "correct": true, + "index": "document_44", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.17339630285277963, + "B": 3.48275788128376, + "C": 45.16508877277374, + "D": 51.17875337600708 + }, + "correct": false, + "index": "document_45", + "category": "document", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 27.777621150016785, + "B": 5.138343572616577, + "C": 66.63505434989929, + "D": 0.44898344203829765 + }, + "correct": true, + "index": "document_46", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 46.56814634799957, + "B": 36.26731038093567, + "C": 3.8225460797548294, + "D": 13.341997563838959 + }, + "correct": true, + "index": "document_47", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 82.02531933784485, + "B": 15.173159539699554, + "C": 1.0991399176418781, + "D": 1.7023811116814613 + }, + "correct": true, + "index": "document_48", + "category": "document", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 3.851884603500366, + "B": 34.33147370815277, + "C": 49.95199739933014, + "D": 11.864639818668365 + }, + "correct": false, + "index": "document_49", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 6.936073303222656, + "B": 70.05186080932617, + "C": 21.36460840702057, + "D": 1.6474619507789612 + }, + "correct": false, + "index": "document_50", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 15.304383635520935, + "B": 23.703891038894653, + "C": 28.59235107898712, + "D": 32.39937722682953 + }, + "correct": true, + "index": "document_51", + "category": "document", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 7.7522434294223785, + "B": 3.2316159456968307, + "C": 5.671662464737892, + "D": 83.34447145462036 + }, + "correct": true, + "index": "document_52", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 40.70090651512146, + "B": 59.219467639923096, + "C": 0.050729396753013134, + "D": 0.02890474279411137 + }, + "correct": true, + "index": "document_53", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 19.899234175682068, + "B": 69.45514678955078, + "C": 10.00596359372139, + "D": 0.6396597716957331 + }, + "correct": false, + "index": "document_54", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 37.41692006587982, + "B": 54.44129705429077, + "C": 4.198062047362328, + "D": 3.9437144994735718 + }, + "correct": false, + "index": "document_55", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 7.776281982660294, + "B": 78.53766679763794, + "C": 11.314424127340317, + "D": 2.371631935238838 + }, + "correct": false, + "index": "document_56", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 7.6946645975112915, + "B": 82.72544145584106, + "C": 9.281536936759949, + "D": 0.2983545418828726 + }, + "correct": true, + "index": "document_57", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 17.63443499803543, + "B": 30.94939887523651, + "C": 24.10341650247574, + "D": 27.31274962425232 + }, + "correct": true, + "index": "document_58", + "category": "document", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 18.72483491897583, + "B": 21.218019723892212, + "C": 57.67655372619629, + "D": 2.3805957287549973 + }, + "correct": false, + "index": "document_59", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.0842670095153153, + "B": 18.196608126163483, + "C": 81.55153393745422, + "D": 0.16758495476096869 + }, + "correct": true, + "index": "document_60", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 14.336547255516052, + "B": 72.80699610710144, + "C": 12.6519575715065, + "D": 0.20449988078325987 + }, + "correct": false, + "index": "document_61", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 10.252473503351212, + "B": 52.06636190414429, + "C": 35.78465282917023, + "D": 1.8965169787406921 + }, + "correct": true, + "index": "document_62", + "category": "document", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 11.582962423563004, + "B": 20.32873183488846, + "C": 5.471403896808624, + "D": 62.616902589797974 + }, + "correct": true, + "index": "document_63", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 22.0500648021698, + "B": 72.2993791103363, + "C": 3.17661315202713, + "D": 2.473948709666729 + }, + "correct": false, + "index": "document_64", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 5.902405828237534, + "B": 1.4923620037734509, + "C": 92.32916831970215, + "D": 0.27605921495705843 + }, + "correct": true, + "index": "document_65", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.4329503290355206, + "B": 94.37115788459778, + "C": 1.3461322523653507, + "D": 2.8497621417045593 + }, + "correct": true, + "index": "document_66", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.06645599496550858, + "B": 99.61220622062683, + "C": 0.14068734599277377, + "D": 0.1806461252272129 + }, + "correct": true, + "index": "document_67", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 16.36406183242798, + "B": 78.06857228279114, + "C": 4.137482866644859, + "D": 1.4298758469522 + }, + "correct": false, + "index": "document_68", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 4.725073277950287, + "B": 94.90563869476318, + "C": 0.20760525949299335, + "D": 0.16168314032256603 + }, + "correct": false, + "index": "document_69", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.34288696479052305, + "B": 14.579924941062927, + "C": 15.520250797271729, + "D": 69.55693364143372 + }, + "correct": true, + "index": "document_70", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 1.4732735231518745, + "B": 1.0778700932860374, + "C": 97.0267653465271, + "D": 0.422099931165576 + }, + "correct": true, + "index": "document_71", + "category": "document", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 36.160969734191895, + "B": 52.6138961315155, + "C": 9.732592850923538, + "D": 1.4925414696335793 + }, + "correct": true, + "index": "document_72", + "category": "document", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 13.86650800704956, + "B": 45.4665333032608, + "C": 17.80494898557663, + "D": 22.862008213996887 + }, + "correct": false, + "index": "document_73", + "category": "document", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 62.07827925682068, + "B": 6.543002277612686, + "C": 31.214919686317444, + "D": 0.163800863083452 + }, + "correct": true, + "index": "document_74", + "category": "document", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 0.03692240279633552, + "B": 14.895559847354889, + "C": 4.542889446020126, + "D": 80.5246353149414 + }, + "correct": true, + "index": "document_75", + "category": "document", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 4.259958490729332, + "B": 85.56355237960815, + "C": 9.599964320659637, + "D": 0.5765226669609547 + }, + "correct": true, + "index": "document_76", + "category": "document", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 99.31246638298035, + "B": 0.6286195944994688, + "C": 0.031297130044549704, + "D": 0.02761961950454861 + }, + "correct": true, + "index": "document_77", + "category": "document", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 38.660022616386414, + "B": 49.64045286178589, + "C": 3.5959426313638687, + "D": 8.1035815179348 + }, + "correct": false, + "index": "document_78", + "category": "document", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 38.25322687625885, + "B": 18.069544434547424, + "C": 23.201754689216614, + "D": 20.47547698020935 + }, + "correct": false, + "index": "document_79", + "category": "document", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 12.797504663467407, + "B": 17.49211549758911, + "C": 37.03080713748932, + "D": 32.67957270145416 + }, + "correct": false, + "index": "table_0", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 10.766927897930145, + "B": 51.36613845825195, + "C": 17.75166392326355, + "D": 20.115269720554352 + }, + "correct": false, + "index": "table_1", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 6.847866624593735, + "B": 37.019217014312744, + "C": 30.690011382102966, + "D": 25.44291317462921 + }, + "correct": false, + "index": "table_2", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 7.918912172317505, + "B": 51.63779258728027, + "C": 20.22164911031723, + "D": 20.22164911031723 + }, + "correct": true, + "index": "table_3", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 1.3450450263917446, + "B": 3.656211495399475, + "C": 6.416851282119751, + "D": 88.58189582824707 + }, + "correct": false, + "index": "table_4", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.5143040791153908, + "B": 1.022815890610218, + "C": 0.4538718145340681, + "D": 98.00901412963867 + }, + "correct": true, + "index": "table_5", + "category": "table", + "answer": "D" + }, + { + "pred": "D", + "probs": { + "A": 5.235081166028976, + "B": 23.462006449699402, + "C": 30.12581169605255, + "D": 41.17710590362549 + }, + "correct": true, + "index": "table_6", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 25.97462236881256, + "B": 21.533718705177307, + "C": 51.656705141067505, + "D": 0.8349528536200523 + }, + "correct": false, + "index": "table_7", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.9266645647585392, + "B": 88.79553079605103, + "C": 2.51893550157547, + "D": 7.758866995573044 + }, + "correct": true, + "index": "table_8", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 4.741000756621361, + "B": 54.25788164138794, + "C": 27.282574772834778, + "D": 13.718540966510773 + }, + "correct": true, + "index": "table_9", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 20.331767201423645, + "B": 40.43454825878143, + "C": 26.10650658607483, + "D": 13.127174973487854 + }, + "correct": false, + "index": "table_10", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 10.537608712911606, + "B": 36.779868602752686, + "C": 39.15196657180786, + "D": 13.530558347702026 + }, + "correct": false, + "index": "table_11", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 24.051488935947418, + "B": 57.69652724266052, + "C": 11.361118406057358, + "D": 6.890867650508881 + }, + "correct": true, + "index": "table_12", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.8873241953551769, + "B": 96.34689092636108, + "C": 1.8784655258059502, + "D": 0.8873241953551769 + }, + "correct": false, + "index": "table_13", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 38.90226185321808, + "B": 22.16583788394928, + "C": 28.461501002311707, + "D": 10.470401495695114 + }, + "correct": true, + "index": "table_14", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 21.586406230926514, + "B": 22.978609800338745, + "C": 27.71749496459961, + "D": 27.71749496459961 + }, + "correct": false, + "index": "table_15", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 30.67336678504944, + "B": 32.65163004398346, + "C": 12.786561250686646, + "D": 23.888441920280457 + }, + "correct": true, + "index": "table_16", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 48.61929714679718, + "B": 37.864744663238525, + "C": 8.993665874004364, + "D": 4.522298648953438 + }, + "correct": false, + "index": "table_17", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 1.9068868830800056, + "B": 0.21394677460193634, + "C": 71.55539989471436, + "D": 26.323765516281128 + }, + "correct": true, + "index": "table_18", + "category": "table", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 38.44664692878723, + "B": 10.347775369882584, + "C": 31.873393058776855, + "D": 19.332188367843628 + }, + "correct": false, + "index": "table_19", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 4.415493458509445, + "B": 21.065141260623932, + "C": 41.89303517341614, + "D": 32.626330852508545 + }, + "correct": false, + "index": "table_20", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 18.63463968038559, + "B": 47.58521914482117, + "C": 11.302480846643448, + "D": 22.477667033672333 + }, + "correct": true, + "index": "table_21", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.9025906696915627, + "B": 96.12059593200684, + "C": 0.6894256453961134, + "D": 0.28739538975059986 + }, + "correct": true, + "index": "table_22", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 52.93984413146973, + "B": 28.336656093597412, + "C": 7.626707851886749, + "D": 11.096793413162231 + }, + "correct": true, + "index": "table_23", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 1.7089363187551498, + "B": 87.65169978141785, + "C": 2.486487478017807, + "D": 8.152878284454346 + }, + "correct": true, + "index": "table_24", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 48.44701886177063, + "B": 13.0393385887146, + "C": 37.73057460784912, + "D": 0.7830731570720673 + }, + "correct": false, + "index": "table_25", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 3.7332765758037567, + "B": 37.7047598361969, + "C": 10.148098319768906, + "D": 48.41386675834656 + }, + "correct": true, + "index": "table_26", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 6.9012850522994995, + "B": 16.55532270669937, + "C": 57.78375267982483, + "D": 18.75963807106018 + }, + "correct": false, + "index": "table_27", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.042784257675521076, + "B": 0.5212189629673958, + "C": 99.32675361633301, + "D": 0.10925342794507742 + }, + "correct": true, + "index": "table_28", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 38.72057795524597, + "B": 6.320960074663162, + "C": 49.718207120895386, + "D": 5.240260437130928 + }, + "correct": true, + "index": "table_29", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 19.19368803501129, + "B": 33.68597328662872, + "C": 27.926653623580933, + "D": 19.19368803501129 + }, + "correct": false, + "index": "table_30", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 13.390389084815979, + "B": 56.375640630722046, + "C": 23.50086271762848, + "D": 6.733110547065735 + }, + "correct": true, + "index": "table_31", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 2.20473725348711, + "B": 7.229054719209671, + "C": 2.498294599354267, + "D": 88.06791305541992 + }, + "correct": true, + "index": "table_32", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.644673176109791, + "B": 2.192511036992073, + "C": 93.22794079780579, + "D": 1.9348841160535812 + }, + "correct": true, + "index": "table_33", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 25.800633430480957, + "B": 13.810083270072937, + "C": 48.201924562454224, + "D": 12.187355011701584 + }, + "correct": true, + "index": "table_34", + "category": "table", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 47.05280065536499, + "B": 18.426141142845154, + "C": 28.538966178894043, + "D": 5.982091650366783 + }, + "correct": true, + "index": "table_35", + "category": "table", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 30.085110664367676, + "B": 17.141979932785034, + "C": 3.1709469854831696, + "D": 49.60196018218994 + }, + "correct": false, + "index": "table_36", + "category": "table", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 55.63656687736511, + "B": 18.062548339366913, + "C": 7.073395699262619, + "D": 19.227483868598938 + }, + "correct": true, + "index": "table_37", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 34.043896198272705, + "B": 15.106888115406036, + "C": 43.71322989463806, + "D": 7.135988771915436 + }, + "correct": false, + "index": "table_38", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.8454849943518639, + "B": 43.365103006362915, + "C": 12.42431029677391, + "D": 43.365103006362915 + }, + "correct": false, + "index": "table_39", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 15.892323851585388, + "B": 59.047144651412964, + "C": 18.008360266685486, + "D": 7.05217570066452 + }, + "correct": false, + "index": "table_40", + "category": "table", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 6.776099652051926, + "B": 17.303377389907837, + "C": 34.411874413490295, + "D": 41.508644819259644 + }, + "correct": false, + "index": "table_41", + "category": "table", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.06036772974766791, + "B": 14.771495759487152, + "C": 75.01584887504578, + "D": 10.152290761470795 + }, + "correct": true, + "index": "table_42", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.6989445071667433, + "B": 7.059089839458466, + "C": 48.99979531764984, + "D": 43.24216544628143 + }, + "correct": false, + "index": "table_43", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 17.840413749217987, + "B": 45.55709362030029, + "C": 27.63177454471588, + "D": 8.970723301172256 + }, + "correct": false, + "index": "table_44", + "category": "table", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 69.63133215904236, + "B": 19.949711859226227, + "C": 8.316276967525482, + "D": 2.1026840433478355 + }, + "correct": false, + "index": "table_45", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 0.12286199489608407, + "B": 98.57388734817505, + "C": 0.5506292451173067, + "D": 0.7526208646595478 + }, + "correct": true, + "index": "table_46", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 10.337192565202713, + "B": 86.55225038528442, + "C": 1.7963346093893051, + "D": 1.3142265379428864 + }, + "correct": false, + "index": "table_47", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 21.082329750061035, + "B": 32.652950286865234, + "C": 32.652950286865234, + "D": 13.611774146556854 + }, + "correct": false, + "index": "table_48", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 17.66803413629532, + "B": 42.38341152667999, + "C": 37.403228878974915, + "D": 2.5453217327594757 + }, + "correct": false, + "index": "table_49", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 29.928934574127197, + "B": 40.90800583362579, + "C": 18.152818083763123, + "D": 11.010240763425827 + }, + "correct": false, + "index": "table_50", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 3.6092855036258698, + "B": 17.21893697977066, + "C": 63.976114988327026, + "D": 15.195658802986145 + }, + "correct": true, + "index": "table_51", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 2.4993104860186577, + "B": 88.10372948646545, + "C": 3.0147437006235123, + "D": 6.382212787866592 + }, + "correct": true, + "index": "table_52", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 4.572735354304314, + "B": 91.84584617614746, + "C": 1.7907090485095978, + "D": 1.7907090485095978 + }, + "correct": true, + "index": "table_53", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 11.849864572286606, + "B": 46.86712622642517, + "C": 25.086164474487305, + "D": 16.19684547185898 + }, + "correct": true, + "index": "table_54", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 21.358492970466614, + "B": 33.080679178237915, + "C": 21.358492970466614, + "D": 24.202340841293335 + }, + "correct": false, + "index": "table_55", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 15.278439223766327, + "B": 50.09607672691345, + "C": 17.31274127960205, + "D": 17.31274127960205 + }, + "correct": false, + "index": "table_56", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 6.428610533475876, + "B": 14.487098157405853, + "C": 78.31650972366333, + "D": 0.7677880581468344 + }, + "correct": true, + "index": "table_57", + "category": "table", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 57.336992025375366, + "B": 34.77664291858673, + "C": 1.843094639480114, + "D": 6.043273955583572 + }, + "correct": true, + "index": "table_58", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.16866823425516486, + "B": 0.15844913432374597, + "C": 99.005788564682, + "D": 0.6670957431197166 + }, + "correct": true, + "index": "table_59", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 13.829326629638672, + "B": 27.50290036201477, + "C": 31.16486966609955, + "D": 27.50290036201477 + }, + "correct": false, + "index": "table_60", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.7387660443782806, + "B": 0.8371315896511078, + "C": 96.75925970077515, + "D": 1.6648350283503532 + }, + "correct": true, + "index": "table_61", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.10974174365401268, + "B": 0.04869760887231678, + "C": 99.77070093154907, + "D": 0.07085459656082094 + }, + "correct": true, + "index": "table_62", + "category": "table", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 0.12355685466900468, + "B": 0.5537433549761772, + "C": 11.839555948972702, + "D": 87.48314380645752 + }, + "correct": true, + "index": "table_63", + "category": "table", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 0.26071055326610804, + "B": 0.17918356461450458, + "C": 98.80572557449341, + "D": 0.7543909829109907 + }, + "correct": true, + "index": "table_64", + "category": "table", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 0.8238010108470917, + "B": 9.427902102470398, + "C": 84.02997851371765, + "D": 5.718312039971352 + }, + "correct": true, + "index": "table_65", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 12.128648906946182, + "B": 61.594367027282715, + "C": 15.573494136333466, + "D": 10.703495144844055 + }, + "correct": true, + "index": "table_66", + "category": "table", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 55.710822343826294, + "B": 1.2308123521506786, + "C": 40.75890779495239, + "D": 2.299460396170616 + }, + "correct": true, + "index": "table_67", + "category": "table", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 0.7334352005273104, + "B": 1.552682463079691, + "C": 96.06106281280518, + "D": 1.6528217121958733 + }, + "correct": false, + "index": "table_68", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 0.13203845592215657, + "B": 99.51794147491455, + "C": 0.18047516932711005, + "D": 0.16954074380919337 + }, + "correct": true, + "index": "table_69", + "category": "table", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.4230132792145014, + "B": 0.9532752446830273, + "C": 1.387007161974907, + "D": 97.23671078681946 + }, + "correct": true, + "index": "table_70", + "category": "table", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 38.80608081817627, + "B": 46.8090683221817, + "C": 7.641370594501495, + "D": 6.743485480546951 + }, + "correct": false, + "index": "table_71", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 31.24864101409912, + "B": 40.12404978275299, + "C": 14.760814607143402, + "D": 13.866500556468964 + }, + "correct": true, + "index": "table_72", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 2.235070802271366, + "B": 65.31834602355957, + "C": 28.98484170436859, + "D": 3.4617457538843155 + }, + "correct": true, + "index": "table_73", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.6773352399468422, + "B": 97.48576283454895, + "C": 0.1376840635202825, + "D": 0.6992172915488482 + }, + "correct": false, + "index": "table_74", + "category": "table", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 1.4289830811321735, + "B": 94.10988688468933, + "C": 1.9531883299350739, + "D": 2.5079434737563133 + }, + "correct": true, + "index": "table_75", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 19.140945374965668, + "B": 66.80846214294434, + "C": 13.155364990234375, + "D": 0.8952339179813862 + }, + "correct": true, + "index": "table_76", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 11.499189585447311, + "B": 62.164026498794556, + "C": 20.181705057621002, + "D": 6.155072525143623 + }, + "correct": false, + "index": "table_77", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 14.254188537597656, + "B": 41.2458598613739, + "C": 28.347837924957275, + "D": 16.152110695838928 + }, + "correct": true, + "index": "table_78", + "category": "table", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 11.103440076112747, + "B": 38.75481188297272, + "C": 26.63576900959015, + "D": 23.505982756614685 + }, + "correct": false, + "index": "table_79", + "category": "table", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 12.278513610363007, + "B": 45.62021195888519, + "C": 35.5290561914444, + "D": 6.572215259075165 + }, + "correct": false, + "index": "chart_0", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 15.685223042964935, + "B": 27.528423070907593, + "C": 35.3471964597702, + "D": 21.43915891647339 + }, + "correct": false, + "index": "chart_1", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 29.17223572731018, + "B": 51.198869943618774, + "C": 8.897028863430023, + "D": 10.731866210699081 + }, + "correct": true, + "index": "chart_2", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.9654559195041656, + "B": 13.327708840370178, + "C": 81.64211511611938, + "D": 4.064721241593361 + }, + "correct": false, + "index": "chart_3", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 10.609026998281479, + "B": 88.82828950881958, + "C": 0.4113566130399704, + "D": 0.15132965054363012 + }, + "correct": true, + "index": "chart_4", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 3.2365448772907257, + "B": 94.58571076393127, + "C": 1.1906583793461323, + "D": 0.9870905429124832 + }, + "correct": true, + "index": "chart_5", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 9.352423995733261, + "B": 34.74847078323364, + "C": 44.617921113967896, + "D": 11.281176656484604 + }, + "correct": false, + "index": "chart_6", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 22.764331102371216, + "B": 27.459025382995605, + "C": 33.121904730796814, + "D": 16.654740273952484 + }, + "correct": false, + "index": "chart_7", + "category": "chart", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 3.125288337469101, + "B": 16.895149648189545, + "C": 13.157954812049866, + "D": 66.82161092758179 + }, + "correct": false, + "index": "chart_8", + "category": "chart", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 15.021100640296936, + "B": 24.765609204769135, + "C": 21.85557186603546, + "D": 38.357725739479065 + }, + "correct": false, + "index": "chart_9", + "category": "chart", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.6297232117503881, + "B": 2.4906037375330925, + "C": 28.503447771072388, + "D": 68.37621927261353 + }, + "correct": true, + "index": "chart_10", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 63.549911975860596, + "B": 34.01581645011902, + "C": 2.1745583042502403, + "D": 0.2597139682620764 + }, + "correct": false, + "index": "chart_11", + "category": "chart", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 44.42299008369446, + "B": 39.20314908027649, + "C": 12.727399170398712, + "D": 3.646460920572281 + }, + "correct": false, + "index": "chart_12", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.39831739850342274, + "B": 0.6567143369466066, + "C": 97.46504426002502, + "D": 1.4799285680055618 + }, + "correct": true, + "index": "chart_13", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 82.57291316986084, + "B": 16.25957041978836, + "C": 0.40705036371946335, + "D": 0.760470237582922 + }, + "correct": true, + "index": "chart_14", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 14.856046438217163, + "B": 35.6378048658371, + "C": 37.936243414878845, + "D": 11.569900065660477 + }, + "correct": false, + "index": "chart_15", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 0.937116052955389, + "B": 5.066001787781715, + "C": 89.7970199584961, + "D": 4.199862852692604 + }, + "correct": true, + "index": "chart_16", + "category": "chart", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 5.544998124241829, + "B": 6.688544154167175, + "C": 6.283305585384369, + "D": 81.48314952850342 + }, + "correct": true, + "index": "chart_17", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 13.626475632190704, + "B": 18.625181913375854, + "C": 37.04059720039368, + "D": 30.70773482322693 + }, + "correct": false, + "index": "chart_18", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 15.64062386751175, + "B": 31.105095148086548, + "C": 48.176512122154236, + "D": 5.077766999602318 + }, + "correct": false, + "index": "chart_19", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 6.103765219449997, + "B": 27.35517919063568, + "C": 54.402267932891846, + "D": 12.138787657022476 + }, + "correct": true, + "index": "chart_20", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 29.39412295818329, + "B": 37.74280250072479, + "C": 13.884802162647247, + "D": 18.97827237844467 + }, + "correct": false, + "index": "chart_21", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 22.39098995923996, + "B": 41.83187484741211, + "C": 27.00868844985962, + "D": 8.768437802791595 + }, + "correct": true, + "index": "chart_22", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 47.58704602718353, + "B": 50.65614581108093, + "C": 0.7691729348152876, + "D": 0.9876376949250698 + }, + "correct": false, + "index": "chart_23", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 2.8692204505205154, + "B": 39.608365297317505, + "C": 22.56816476583481, + "D": 34.95425879955292 + }, + "correct": false, + "index": "chart_24", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 6.312061846256256, + "B": 81.85606002807617, + "C": 11.078012734651566, + "D": 0.7538681849837303 + }, + "correct": false, + "index": "chart_25", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 1.19038550183177, + "B": 21.100085973739624, + "C": 50.61647891998291, + "D": 27.09304988384247 + }, + "correct": false, + "index": "chart_26", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 87.65923976898193, + "B": 9.835093468427658, + "C": 1.3310352340340614, + "D": 1.1746345087885857 + }, + "correct": false, + "index": "chart_27", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.529074739664793, + "B": 94.60050463676453, + "C": 1.3494037091732025, + "D": 2.52101793885231 + }, + "correct": true, + "index": "chart_28", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 1.014636643230915, + "B": 97.2252607345581, + "C": 1.3868438079953194, + "D": 0.37326395977288485 + }, + "correct": true, + "index": "chart_29", + "category": "chart", + "answer": "B" + }, + { + "pred": "A", + "probs": { + "A": 44.01172399520874, + "B": 18.346814811229706, + "C": 9.225358068943024, + "D": 28.41610610485077 + }, + "correct": false, + "index": "chart_30", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 4.2763326317071915, + "B": 3.7738505750894547, + "C": 45.974910259246826, + "D": 45.974910259246826 + }, + "correct": true, + "index": "chart_31", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 2.8520332649350166, + "B": 12.007508426904678, + "C": 78.2987892627716, + "D": 6.841671466827393 + }, + "correct": true, + "index": "chart_32", + "category": "chart", + "answer": "C" + }, + { + "pred": "A", + "probs": { + "A": 88.64749670028687, + "B": 6.835760921239853, + "C": 1.839820109307766, + "D": 2.676922455430031 + }, + "correct": true, + "index": "chart_33", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 8.101025968790054, + "B": 56.232261657714844, + "C": 30.098962783813477, + "D": 5.567748099565506 + }, + "correct": false, + "index": "chart_34", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 25.532925128936768, + "B": 73.88196587562561, + "C": 0.22090307902544737, + "D": 0.364207592792809 + }, + "correct": true, + "index": "chart_35", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 8.230116963386536, + "B": 41.79598391056061, + "C": 32.55074620246887, + "D": 17.423158884048462 + }, + "correct": false, + "index": "chart_36", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.1275343373417854, + "B": 11.501339823007584, + "C": 66.1856472492218, + "D": 20.185481011867523 + }, + "correct": false, + "index": "chart_37", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 7.818063348531723, + "B": 47.891443967819214, + "C": 32.915276288986206, + "D": 11.375215649604797 + }, + "correct": true, + "index": "chart_38", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 24.961131811141968, + "B": 52.84271240234375, + "C": 10.405346751213074, + "D": 11.79080381989479 + }, + "correct": false, + "index": "chart_39", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 31.852546334266663, + "B": 49.33418929576874, + "C": 13.278117775917053, + "D": 5.535142496228218 + }, + "correct": false, + "index": "chart_40", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 23.245103657245636, + "B": 23.245103657245636, + "C": 49.20988380908966, + "D": 4.299911484122276 + }, + "correct": false, + "index": "chart_41", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 15.03436267375946, + "B": 76.35079622268677, + "C": 4.307417571544647, + "D": 4.307417571544647 + }, + "correct": false, + "index": "chart_42", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 9.278222918510437, + "B": 1.2556709349155426, + "C": 68.55731010437012, + "D": 20.908796787261963 + }, + "correct": true, + "index": "chart_43", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 15.026605129241943, + "B": 55.8306097984314, + "C": 15.026605129241943, + "D": 14.116188883781433 + }, + "correct": false, + "index": "chart_44", + "category": "chart", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 5.281994491815567, + "B": 32.3561429977417, + "C": 15.283958613872528, + "D": 47.077906131744385 + }, + "correct": true, + "index": "chart_45", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 4.203706607222557, + "B": 48.10887575149536, + "C": 31.061425805091858, + "D": 16.625984013080597 + }, + "correct": false, + "index": "chart_46", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 33.313509821891785, + "B": 58.467036485672, + "C": 7.9126521944999695, + "D": 0.30680682975798845 + }, + "correct": false, + "index": "chart_47", + "category": "chart", + "answer": "A" + }, + { + "pred": "D", + "probs": { + "A": 1.9463086500763893, + "B": 16.29624366760254, + "C": 8.722750842571259, + "D": 73.03469181060791 + }, + "correct": true, + "index": "chart_48", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 80.7334840297699, + "B": 9.642240405082703, + "C": 5.848314240574837, + "D": 3.7759557366371155 + }, + "correct": true, + "index": "chart_49", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 21.02177143096924, + "B": 30.586495995521545, + "C": 44.50308978557587, + "D": 3.8886364549398422 + }, + "correct": false, + "index": "chart_50", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 10.011006146669388, + "B": 17.56986379623413, + "C": 39.59429860115051, + "D": 32.82482624053955 + }, + "correct": false, + "index": "chart_51", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 5.928324908018112, + "B": 14.22131359577179, + "C": 63.73550295829773, + "D": 16.11485779285431 + }, + "correct": false, + "index": "chart_52", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 40.58486819267273, + "B": 59.0506374835968, + "C": 0.1879452378489077, + "D": 0.1765582012012601 + }, + "correct": true, + "index": "chart_53", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 12.811601161956787, + "B": 53.93885374069214, + "C": 25.47891139984131, + "D": 7.7706292271614075 + }, + "correct": false, + "index": "chart_54", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 10.222042351961136, + "B": 40.42896330356598, + "C": 15.832209587097168, + "D": 33.516788482666016 + }, + "correct": true, + "index": "chart_55", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 7.957545667886734, + "B": 27.774563431739807, + "C": 58.79875421524048, + "D": 5.469135567545891 + }, + "correct": false, + "index": "chart_56", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 1.9912131130695343, + "B": 70.19268274307251, + "C": 18.89210343360901, + "D": 8.923996984958649 + }, + "correct": true, + "index": "chart_57", + "category": "chart", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 0.22435535211116076, + "B": 5.786200985312462, + "C": 8.961842954158783, + "D": 85.0275993347168 + }, + "correct": true, + "index": "chart_58", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 13.042183220386505, + "B": 66.23367667198181, + "C": 16.74649715423584, + "D": 3.977641463279724 + }, + "correct": false, + "index": "chart_59", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 3.5780437290668488, + "B": 26.438364386558533, + "C": 49.393367767333984, + "D": 20.590218901634216 + }, + "correct": false, + "index": "chart_60", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 31.080570816993713, + "B": 45.22196352481842, + "C": 12.95630931854248, + "D": 10.741157829761505 + }, + "correct": true, + "index": "chart_61", + "category": "chart", + "answer": "B" + }, + { + "pred": "C", + "probs": { + "A": 4.143275693058968, + "B": 16.38697236776352, + "C": 73.44131469726562, + "D": 6.028430163860321 + }, + "correct": false, + "index": "chart_62", + "category": "chart", + "answer": "A" + }, + { + "pred": "A", + "probs": { + "A": 41.69284105300903, + "B": 30.503132939338684, + "C": 9.302930533885956, + "D": 18.50108653306961 + }, + "correct": false, + "index": "chart_63", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 10.202977061271667, + "B": 45.7265704870224, + "C": 35.61188876628876, + "D": 8.458565175533295 + }, + "correct": false, + "index": "chart_64", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 2.35015582293272, + "B": 93.8766360282898, + "C": 2.663075365126133, + "D": 1.110134832561016 + }, + "correct": true, + "index": "chart_65", + "category": "chart", + "answer": "B" + }, + { + "pred": "D", + "probs": { + "A": 4.365641623735428, + "B": 38.91053795814514, + "C": 12.632402777671814, + "D": 44.09141540527344 + }, + "correct": false, + "index": "chart_66", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 8.708760142326355, + "B": 77.62033939361572, + "C": 5.9854380786418915, + "D": 7.685454934835434 + }, + "correct": true, + "index": "chart_67", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 14.30434137582779, + "B": 64.10760879516602, + "C": 8.150367438793182, + "D": 13.437683880329132 + }, + "correct": false, + "index": "chart_68", + "category": "chart", + "answer": "D" + }, + { + "pred": "A", + "probs": { + "A": 53.05098295211792, + "B": 28.39614748954773, + "C": 12.600713968276978, + "D": 5.952155217528343 + }, + "correct": false, + "index": "chart_69", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 23.221436142921448, + "B": 71.52706384658813, + "C": 2.9522744938731194, + "D": 2.2992337122559547 + }, + "correct": false, + "index": "chart_70", + "category": "chart", + "answer": "D" + }, + { + "pred": "B", + "probs": { + "A": 3.898301348090172, + "B": 94.44719552993774, + "C": 0.4655856639146805, + "D": 1.1889147572219372 + }, + "correct": false, + "index": "chart_71", + "category": "chart", + "answer": "A" + }, + { + "pred": "B", + "probs": { + "A": 12.71015852689743, + "B": 47.22397029399872, + "C": 23.74570220708847, + "D": 16.32016748189926 + }, + "correct": false, + "index": "chart_72", + "category": "chart", + "answer": "C" + }, + { + "pred": "D", + "probs": { + "A": 7.868167757987976, + "B": 29.233789443969727, + "C": 14.699670672416687, + "D": 48.19836914539337 + }, + "correct": false, + "index": "chart_73", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 5.338218808174133, + "B": 61.09268069267273, + "C": 4.710961878299713, + "D": 28.858140110969543 + }, + "correct": false, + "index": "chart_74", + "category": "chart", + "answer": "A" + }, + { + "pred": "C", + "probs": { + "A": 7.927338778972626, + "B": 21.548740565776825, + "C": 42.85478889942169, + "D": 27.669131755828857 + }, + "correct": true, + "index": "chart_75", + "category": "chart", + "answer": "C" + }, + { + "pred": "B", + "probs": { + "A": 2.626761421561241, + "B": 59.7848117351532, + "C": 11.059078574180603, + "D": 26.529350876808167 + }, + "correct": false, + "index": "chart_76", + "category": "chart", + "answer": "C" + }, + { + "pred": "C", + "probs": { + "A": 1.938149705529213, + "B": 13.453425467014313, + "C": 82.41221904754639, + "D": 2.1962111815810204 + }, + "correct": false, + "index": "chart_77", + "category": "chart", + "answer": "B" + }, + { + "pred": "B", + "probs": { + "A": 18.581780791282654, + "B": 57.23591446876526, + "C": 13.594722747802734, + "D": 10.587580502033234 + }, + "correct": false, + "index": "chart_78", + "category": "chart", + "answer": "D" + }, + { + "pred": "C", + "probs": { + "A": 2.6853693649172783, + "B": 1.5300773084163666, + "C": 88.92722129821777, + "D": 6.857331097126007 + }, + "correct": true, + "index": "chart_79", + "category": "chart", + "answer": "C" + } + ] + } +} \ No newline at end of file diff --git a/FOEM/pseudo/ABLATION_REPORT.md b/FOEM/pseudo/ABLATION_REPORT.md new file mode 100644 index 0000000..9463e0e --- /dev/null +++ b/FOEM/pseudo/ABLATION_REPORT.md @@ -0,0 +1,273 @@ +# FOEM 3-bit 양자화 Ablation 실험 보고서 +**act-order(desc_act) / 캘리브레이션 언어(en vs ko) / FOEM alpha·beta / group_size 튜닝** + +작성일: 2026-07-08 · 모델: `mistralai/Ministral-3-3B-Instruct-2512-BF16` · 방법: FOEM 3-bit (베이스라인: α=0, β=0.2, group_size=128 → **최종 권장: group_size=32**) + +--- + +## 1. 목적 + +`pseudo/KMMLU_REPORT.md` / `pseudo/KDTCBENCH_REPORT.md`에서 확인된 FOEM 3-bit의 큰 정확도 손실(KMMLU -11.30%p, K-DTCBench -11.25%p)을 줄이기 위해 다섯 가지 축을 튜닝했다. + +1. **act-order (`desc_act=True`)**: GPTQ 계열에서 activation 크기 순으로 열을 재정렬한 뒤 양자화하는 옵션. 일반적으로 정확도 개선 폭이 가장 큰 단일 스위치로 알려져 있음. +2. **캘리브레이션 언어**: 기존 파이프라인은 영어 `allenai/c4`를 사용하는데, 평가셋(KMMLU/K-DTCBench)은 한국어 중심이므로 한국어 코퍼스로 캘리브레이션하면 실제 평가 분포에 더 잘 맞을 것이라는 가설. +3. **FOEM alpha/beta**: FOEM 고유 파라미터. alpha는 GPTAQ 스타일 1차 보정 항의 강도(베이스라인 0.0=비활성), beta는 누적 오차 직접 피드백 강도(베이스라인 0.2). 두 값을 그리드로 조정. +4. **group_size**: 양자화 시 scale/zero-point를 공유하는 가중치 묶음 크기(베이스라인 128). 축소하면 정확도↑, 파일 크기↑. +5. **mixed-precision 레이어 스킵**: 손실이 큰 일부 모듈(gate/up_proj)이나 레이어(후반부)만 4-bit로 남기고 나머지는 3-bit 유지. + +**결론을 먼저 요약하면**: 앞의 네 축(act-order, calib-language, alpha/beta, mixed-precision — 총 9개 설정)은 전부 베이스라인과 동률이거나 나빴다. 유일하게 **group_size를 32로 축소했을 때만 PPL과 K-DTCBench가 모두 개선**됐다 (파일 크기 +5.9%만 대가로). 이번 세션에서 시도한 11개 대안 설정 중 베이스라인을 이긴 유일한 조합이며, 최종 권장 설정이다. 상세 원인 분석은 9절 참고. + +--- + +## 2. 공통 실험 설정 + +| 항목 | 값 | +|---|---| +| 모델 | `mistralai/Ministral-3-3B-Instruct-2512-BF16` | +| 양자화 방법 | FOEM, 3-bit, group_size=128 | +| FOEM 파라미터 | alpha=0.0, beta=0.2 (베이스라인과 동일, 이번 실험에서는 미변경) | +| 캘리브레이션 샘플 수 | 256 | +| batch_size | 4 | +| 평가 (빠른 반복용) | WikiText-2 PPL + K-DTCBench (zero-shot, 240문항) — 각 1.5분 내외 | +| 평가 (생략) | KMMLU (45과목 5-shot, 65분 소요) — `--skip-kmmlu`로 매 실험마다 생략, 최종 선정 설정에서만 재실행 예정 | +| 구현 | `pseudo/quantize_mistral.py` (이번 세션에서 `--desc-act`, `--calib-lang` 플래그 및 K-DTCBench 자동 평가 통합 추가) | + +### 베이스라인 (기존 `Ministral-3-3B-Instruct-2512-BF16_foem_3bit`) + +| 지표 | 값 | +|---|---:| +| desc_act | False (기본값) | +| 캘리브레이션 | `allenai/c4` (영어), 256 샘플, 길이 절단 없음 | +| WikiText-2 PPL | **10.8654** | +| KMMLU 정확도 (micro) | **35.58%** | +| K-DTCBench 정확도 (micro=macro) | **50.83%** (document 58.75% / table 56.25% / chart 37.50%) | + +--- + +## 3. 실험 1: `desc_act=True` + 한국어 캘리브레이션 (문서 서두만 절단) + +### 3-1. 캘리브레이션 데이터 분포 설정 + +- **소스**: `wikimedia/wikipedia` (`20231101.ko` config), `streaming=True`로 스트림 순서대로 앞에서부터 256개 문서를 가져옴 (`itertools.islice(ds, 256)`). +- **길이 절단**: 각 문서 텍스트를 **항상 0번째 글자부터 1500자까지** 잘라서 사용 (`ex["text"][:1500]`). +- **절단 이유**: 위키 문서를 통째로 쓰면 일부 문서가 수만 자에 달해 캘리브레이션 배치(batch_size=4) 처리 중 단일 텐서 할당이 19.57GiB에 달해 OOM이 발생함 (RTX 5070 12GB 환경). c4/wikitext 샘플은 원래 짧아 이 문제가 없었음 — 이번에 처음 발견된 이슈. +- **알려진 한계 (사후 확인)**: 항상 0번째 글자부터 자르므로 256개 샘플 전부가 "OOO는 ~이다"류의 백과사전 서두 문체로 편중됨. 이는 4절에서 개선함. + +### 3-2. 기술적 이슈 및 수정 + +1. **HF 허브 리비전 불일치**: `mistralai/Ministral-3-3B-Instruct-2512-BF16`의 "main" 리비전이 실험 도중 새 커밋으로 바뀌었는데, 로컬 캐시에는 새 리비전의 config/tokenizer만 받아져 있고 가중치(safetensors)가 없어 첫 실행이 `OSError: no file named model.safetensors`로 실패. `quantize_mistral.py`가 로컬 디렉토리 경로를 직접 받으면 재다운로드 없이 그대로 쓰도록 수정하고, 가중치가 완전한 기존 로컬 스냅샷 경로(`ecc3ba8b...`)를 명시적으로 지정해 해결. +2. **OOM**: 위 3-1의 길이 절단 미적용으로 인한 19.57GiB 할당 실패. 1500자 절단 적용 후 해결. + +### 3-3. 결과 + +| 지표 | 베이스라인 | 실험 1 | 차이 | +|---|---:|---:|---:| +| WikiText-2 PPL | 10.87 | **11.35** | +0.49 (악화) | +| K-DTCBench 전체 | 50.83% | **46.67%** | **-4.16%p** | +| K-DTCBench document | 58.75% | 50.00% | -8.75%p | +| K-DTCBench table | 56.25% | 48.75% | -7.50%p | +| K-DTCBench chart | 37.50% | 41.25% | **+3.75%p** | + +두 지표 모두 베이스라인보다 악화. document/table처럼 텍스트를 정밀 판독해야 하는 카테고리에서 손실이 크고, chart만 유일하게 개선. + +--- + +## 4. 실험 2: 한국어 캘리브레이션만 적용 (act-order 제외, 다양성 개선) + +실험 1의 손실이 act-order 때문인지 캘리브레이션 때문인지 분리하기 위해, **act-order는 끄고** 캘리브레이션 다양성 문제만 고쳐서 재실행. + +### 4-1. 캘리브레이션 데이터 분포 설정 (개선판) + +실험 1의 "항상 문서 서두만 사용" 편향을 해소하기 위해 두 가지를 변경: + +1. **주제 다양성** — 스트림에서 연속된 256개 문서 대신, **매 10번째 문서**를 골라 총 2,560개 문서를 훑으면서 256개를 추출 (`itertools.islice(ds, 0, 256*10, 10)`). 위키 덤프가 대략 문서 ID 순으로 정렬돼 있어 연속 추출 시 특정 주제군에 쏠릴 수 있는 위험을 줄임. +2. **문서 내 위치 다양성** — 문서 길이가 1500자를 넘으면, **무작위 시작 위치**(`random.Random(seed=0).randint(0, len(text)-1500)`)에서 1500자를 잘라냄. 항상 서두(정의문 위주)가 아니라 본문 중간(사건 서술, 나열, 인용 등 다양한 문체)도 포함되도록 함. 시드를 고정해 재현 가능하게 함. +3. **절단 길이(1500자)는 실험 1과 동일** — OOM 방지 목적은 유지, 이번에는 "어디를 자르는지"만 바꿈. + +| 항목 | 실험 1 (서두 절단) | 실험 2 (다양성 개선) | +|---|---|---| +| 문서 선택 | 스트림 앞 256개 연속 | 매 10번째 문서, 256개 | +| 절단 위치 | 항상 0번째 글자 | 문서별 무작위 시작 위치 | +| 절단 길이 | 1500자 | 1500자 (동일) | +| 재현성 | 결정적 (스트림 순서 고정) | 결정적 (RNG seed=0 고정) | + +### 4-2. 결과 + +| 지표 | 베이스라인 | 실험 1 (서두) | 실험 2 (다양성 개선) | +|---|---:|---:|---:| +| WikiText-2 PPL | 10.87 | 11.35 | **11.11** | +| K-DTCBench 전체 | 50.83% | 46.67% | **47.50%** | +| K-DTCBench document | 58.75% | 50.00% | 53.75% | +| K-DTCBench table | 56.25% | 48.75% | 47.50% | +| K-DTCBench chart | 37.50% | 41.25% | 41.25% | + +다양성 개선으로 실험 1 대비 PPL(-0.24)과 K-DTCBench(+0.83%p)가 소폭 회복됐지만, **여전히 베이스라인보다 K-DTCBench -3.33%p, PPL +0.24 악화** — 캘리브레이션 다양성 문제가 손실의 일부였을 뿐, 근본 원인은 아니었음을 시사한다. + +--- + +## 5. 실험 3: FOEM alpha/beta 그리드 서치 + +실험 1·2에서 act-order와 캘리브레이션 언어 모두 기각된 뒤, en/c4 + desc_act=False (베이스라인 설정)로 복귀하고 FOEM 고유 파라미터인 alpha/beta를 튜닝했다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (베이스라인 β=0.2) +``` + +- **alpha**: GPTAQ 스타일 1차 보정 항의 강도. 베이스라인은 alpha=0.0 (비활성). +- **beta**: 위 식 ②번, 누적 양자화 오차를 다음 갱신에 직접 반영하는 피드백 강도. 베이스라인은 0.2. + +그리드: beta=0.2 고정, alpha∈{0.3, 0.6}로 스크리닝 → 이후 가장 나은 alpha로 beta∈{0.1, 0.4} 스윕. 단, alpha 실험 결과 alpha>0이 전부 K-DTCBench를 악화시켜, beta 스윕은 **alpha=0.0(베이스라인) 고정**으로 진행했다. + +### 5-1. 기술적 이슈 및 수정 (alpha>0 관련) + +alpha=0.3 첫 시도(batch_size=4, 베이스라인과 동일)에서 두 가지 새로운 실패가 발생했다. + +1. **OOM (배치 크기와 무관)**: `Tried to allocate 14.66 GiB`. batch_size를 4→2→1로 줄여도 동일 크기(7.33GiB)의 단일 할당 시도가 반복돼, 원인이 배치 크기가 아니라 **c4 캘리브레이션 샘플 중 하나가 비정상적으로 긴 문서(추정 1만 토큰 이상)** 였음을 확인. 기존 파이프라인은 c4 텍스트 길이를 전혀 캡하지 않았는데, `allenai/c4` 데이터도 허브에서 갱신되며 이런 이상치가 섞여 들어온 것으로 보인다. → `get_calibration()`의 모든 경로(en/ko/fallback)에 공통 길이 캡(`CALIB_MAX_CHARS=2000`자)을 추가해 근본 해결. +2. **RuntimeError (ragged tensor)**: 길이 캡 적용 후에도 `The size of tensor a (2071) must match the size of tensor b (529) at non-singleton dimension 1` 발생. `gptqmodel/quantization/foem.py`의 `process_batch()`가 **alpha>0일 때 배치 내 서로 다른 길이의 시퀀스를 처리하지 못하는 버그**로 확인됨 (alpha=0이면 이 보정 경로 자체가 스킵되어 문제가 드러나지 않았음). → alpha>0 실험은 모두 **batch_size=1**로 우회 (배치 내 길이 불일치가 발생하지 않도록). + +이 두 수정 덕분에 alpha=0.3부터는 정상적으로 양자화가 끝까지 진행됐다. + +### 5-2. 결과 + +| alpha | beta | batch_size | WikiText-2 PPL | K-DTCBench (micro=macro) | vs 베이스라인 | +|---:|---:|---:|---:|---:|---:| +| **0.0** | **0.2 (베이스라인)** | 4 | 10.87 | **50.83%** | - | +| 0.3 | 0.2 | 1 (버그 우회) | 10.74 (개선) | 41.67% | **-9.16%p** | +| 0.6 | 0.2 | 1 (버그 우회) | **10.69 (최고 개선)** | 42.92% | **-7.91%p** | +| 0.0 | 0.1 | 4 | 10.83 | 47.92% | -2.91%p | +| 0.0 | 0.4 | 4 | 11.04 | 49.17% | -1.66%p | + +**핵심 관찰**: alpha를 키울수록(0.0→0.3→0.6) WikiText-2 PPL은 계속 좋아지는데(10.87→10.74→10.69), K-DTCBench는 두 값 모두 베이스라인보다 8~9%p나 나쁘다. **PPL 개선이 다운스트림 VQA 태스크 성능과 반대 방향으로 움직인 사례** — PPL만으로 양자화 설정을 판단하면 안 된다는 근거가 된다. beta는 0.1(47.92%) < 0.4(49.17%) < 0.2(50.83%, 베이스라인) 순으로, 베이스라인이 국소 최적점으로 보인다. + +--- + +## 6. 실험 4: group_size 그리드 서치 (128 vs 64 vs 32) + +`group_size`는 양자화 시 scale/zero-point를 공유하는 연속 가중치 묶음의 크기다. 작을수록(예: 32) 그룹마다 더 세밀하게 캘리브레이션되어 양자화 오차가 줄지만, scale/zero-point 저장 오버헤드가 늘어 파일 크기가 커진다. 베이스라인(128) 대비 32/64로 축소해 **정확도와 파일 크기 트레이드오프**를 확인했다. alpha=0.0, beta=0.2(확인된 최선값), en/c4 캘리브레이션은 고정. + +### 6-1. 결과 (정확도 + 용량) + +| group_size | WikiText-2 PPL | K-DTCBench (micro=macro) | model.safetensors 크기 | 베이스라인 대비 용량 | +|---:|---:|---:|---:|---:| +| **128 (베이스라인)** | 10.87 | 50.83% | 2.840 GB | - | +| 64 | 10.32 (개선) | 48.75% (**-2.08%p**) | 2.896 GB | **+2.0%** | +| **32** | **9.85 (최고 개선)** | **53.33% (+2.50%p)** | 3.008 GB | **+5.9%** | + +(파일 크기는 `model.safetensors`를 직접 `ls -la`로 측정한 실제 값. README의 "압축률 분석" 표는 이번 실험 로그에 원본 BF16 선형 레이어 크기 집계가 누락돼 0.00GB/0.0×로 잘못 표시되는 기존 버그가 있어 여기서는 실측값을 사용했다.) + +### 6-2. 핵심 관찰 + +- **group_size=32가 이번 전체 ablation(실험 1~4, 총 9개 설정) 중 유일하게 PPL과 K-DTCBench 둘 다 베이스라인을 이긴 설정이다.** PPL -1.02, K-DTCBench +2.50%p, 대가는 파일 크기 +5.9%(2.84GB→3.01GB, +168MB)뿐이다. +- **group_size=64는 alpha 실험과 동일한 PPL/K-DTCBench 괴리 패턴을 보인다.** PPL은 베이스라인보다 좋아졌지만(10.32 < 10.87) K-DTCBench는 오히려 나빠졌다(48.75% < 50.83%). 128→64→32로 갈수록 PPL은 단조 개선되지만 K-DTCBench는 128(50.83%) > 64(48.75%) 사이에 32(53.33%)가 끼어드는 비단조 패턴 — n=240(카테고리당 80)의 표본 노이즈일 가능성과, 32만이 어떤 임계 세밀도를 넘어서며 실질적 개선을 준 것일 가능성이 둘 다 있어 후속 검증(예: 다른 캘리브레이션 시드로 재현)이 필요하다. +- 이번 세션 전체에서 시도한 9개 대안 설정(act-order 1개, calib-lang 1개, alpha/beta 4개, group_size 2개) 중 **베이스라인을 이긴 것은 group_size=32가 유일**하다. + +--- + +## 7. 실험 5: mixed-precision 레이어 스킵 (group_size=128 기준) + +group_size=32 발견 이후, "3-bit로 전체를 밀지 말고 손실이 큰 일부 모듈/레이어만 4-bit로 남기면 어떨까"라는 축을 추가로 시도했다. 순수 효과를 보기 위해 group_size는 베이스라인(128)으로 고정하고, alpha=0.0/beta=0.2/en·c4 캘리브레이션도 동일하게 유지했다. gptqmodel `QuantizeConfig`의 `dynamic` 파라미터(`{"+:정규식": {"bits": N}}`)로 모듈별 bit 오버라이드를 구현했다. + +### 7-1. 조합 A — 모듈 타입 기준 (`gate_proj`+`up_proj` → 4-bit) + +기존 quantize 로그의 "모듈별 민감도" 분석에서 SwiGLU 게이트 역할인 `gate_proj`/`up_proj`가 파라미터당 loss가 가장 크다는 게 이미 확인돼 있어, 이 두 모듈만 전체 26개 레이어에 걸쳐 4-bit로 상향했다 (`+:model\.language_model\.layers\.\d+\.mlp\.(gate_proj|up_proj)$` → `{"bits": 4}`). + +### 7-2. 조합 B — 레이어 깊이 기준 (마지막 6개 레이어 → 4-bit) + +"후기 레이어(추론·맥락 이해 담당)일수록 loss 급증" 경향에 기반해, 26개 레이어 중 마지막 6개(20~25)를 통째로 4-bit로 상향했다 (`+:model\.language_model\.layers\.(20|21|22|23|24|25)\..*` → `{"bits": 4}`). + +### 7-3. 기술적 이슈 및 수정 + +1. **HF transformers 지원 경고**: quantize 시작 시 `GPT-QModel's per-module dynamic quantization feature is fully supported in latest vLLM and SGLang but not yet available in hf transformers` 경고가 뜬다. 실제로는 두 조합 모두 PPL이 정상 범위(9.8~10.0대)로 나와, **HF transformers 로딩 경로에서도 추론 자체는 올바르게 동작함**을 확인했다 (경고는 최적화 커널 미지원을 의미하는 것으로 보인다). +2. **gptqmodel GPTQ v1 포맷 변환 버그 (조합 B에서 발견)**: 저장 단계(`pack_module` → `convert_gptq_v2_to_v1_format_module`)에서 `ValueError: 3-bit GPTQ qzeros expects columns divisible by 3, got shape (24, 512)` 발생. 원인은 이 변환 함수가 **모듈별 dynamic bit(4)가 아니라 `QuantizeConfig`의 전역 `bits`(3)를 그대로 사용**해 4-bit로 패킹된 레이어의 qzeros를 3-bit 포맷으로 잘못 해석하려 한 것. → `QuantizeConfig(format=FORMAT.GPTQ_V2)`로 레거시 v1 변환 경로 자체를 건너뛰어 우회 (`--format gptq_v2` CLI 플래그로 노출). 조합 A는 이 버그를 우연히 피해갔다 (건드린 모듈의 텐서 shape가 3으로 나누어떨어져 문제가 드러나지 않았을 뿐으로 추정). + +### 7-4. 결과 + +| 조합 | 변경 대상 | WikiText-2 PPL | K-DTCBench | 파일 크기 | vs 베이스라인 | +|---|---|---:|---:|---:|---:| +| **베이스라인** | 없음 | 10.87 | **50.83%** | 2.840 GB | - | +| A | gate_proj+up_proj (전 레이어) → 4bit | 9.82 (개선) | 50.83% (동률) | 3.025 GB (+6.5%) | K-DTCBench 무변화 | +| B | 마지막 6개 레이어 전체 → 4bit | 9.96 (개선) | 49.58% | 2.928 GB (+3.1%) | **-1.25%p** | + +두 조합 모두 alpha 실험과 같은 패턴을 반복한다 — **PPL은 크게 개선되지만 K-DTCBench는 베이스라인을 넘지 못한다** (A는 정확히 동률, B는 오히려 하락). group_size=32(PPL 9.85, K-DTCBench 53.33%, 파일 +5.9%)와 비교하면, mixed-precision 두 조합 모두 **PPL은 group_size=32와 비슷한 수준으로 개선되지만 K-DTCBench 개선은 재현되지 않았다.** group_size 축소가 "전체 그룹의 스케일 정밀도"를 높이는 반면 mixed-precision은 "일부 모듈만 비트를 올리는" 방식이라, 이번 태스크(K-DTCBench)에서는 전자의 접근이 더 유효한 것으로 보인다. + +--- + +## 8. 종합 비교표 + +| 실험 | desc_act | alpha | beta | group_size | mixed-precision | WikiText-2 PPL | K-DTCBench | 파일 크기 | +|---|:---:|---:|---:|---:|---|---:|---:|---:| +| **베이스라인** | False | 0.0 | 0.2 | 128 | 없음 | 10.87 | 50.83% | 2.840 GB | +| 실험 1 | **True** | 0.0 | 0.2 | 128 | 없음 | 11.35 | 46.67% | - | +| 실험 2 | False | 0.0 | 0.2 | 128 | 없음 | 11.11 | 47.50% | - | +| 실험 3-a | False | 0.3 | 0.2 | 128 | 없음 | 10.74 | 41.67% | - | +| 실험 3-b | False | 0.6 | 0.2 | 128 | 없음 | 10.69 | 42.92% | - | +| 실험 3-c | False | 0.0 | 0.1 | 128 | 없음 | 10.83 | 47.92% | - | +| 실험 3-d | False | 0.0 | 0.4 | 128 | 없음 | 11.04 | 49.17% | - | +| 실험 4-a | False | 0.0 | 0.2 | 64 | 없음 | 10.32 | 48.75% | 2.896 GB | +| **실험 4-b** | False | 0.0 | 0.2 | **32** | 없음 | **9.85** | **53.33%** | 3.008 GB | +| 실험 5-a | False | 0.0 | 0.2 | 128 | gate/up_proj→4bit | 9.82 | 50.83% | 3.025 GB | +| 실험 5-b | False | 0.0 | 0.2 | 128 | 마지막6레이어→4bit | 9.96 | 49.58% | 2.928 GB | + +**11개 설정 중 group_size=32(실험 4-b)만이 베이스라인을 이겼다 — 최종 권장 설정.** + +--- + +## 9. 결론 및 원인 분석 + +1. **act-order(desc_act)는 FOEM과 상성이 나쁘다.** `desc_act=True`를 켜면 gptqmodel이 FOEM 고유의 `act_group_aware` 옵션을 자동으로 끄는 경고가 발생한다 (`QuantizeConfig: desc_act=True automatically disables act_group_aware`). FOEM은 자체 오차 피드백 메커니즘(β 항)에 의존하도록 설계됐는데, act-order의 열 재정렬 방식과 결합되면서 오히려 손실이 커진 것으로 추정된다. **일반 GPTQ에서 효과적인 옵션이 FOEM에는 그대로 적용되지 않을 수 있음**을 보여주는 사례. +2. **"캘리브레이션 언어를 평가 언어에 맞추면 좋아질 것"이라는 가설은 기각됐다.** 다양성을 개선해도 한국어 위키 캘리브레이션은 영어 PPL은 물론 **한국어 평가셋(K-DTCBench)에서도** 영어 c4보다 나쁜 결과를 냈다. 이는 캘리브레이션의 핵심이 "언어 일치"가 아니라 **활성값 분포의 다양성(문체·주제·구조)** 임을 시사한다 — c4(뉴스/포럼/블로그/기술문서 등 웹 크롤링)가 위키백과(균질한 백과사전체)보다 언어와 무관하게 더 풍부한 캘리브레이션 신호를 제공하는 것으로 보인다. +3. **chart 카테고리만 두 실험 모두에서 개선**(37.50% → 41.25%, +3.75%p)됐다는 점은 흥미롭지만 n=80이라 노이즈일 가능성을 배제할 수 없다. 후속 검증이 필요하다. +4. **다양성 개선(실험1→실험2)은 방향은 맞았지만 근본 해법은 아니었다.** 문서 선택 및 크롭 위치를 다양화해 손실을 일부 회복했으나 베이스라인을 넘어서지 못했다. +5. **FOEM alpha(GPTAQ 1차 보정)는 PPL과 K-DTCBench에 반대 방향으로 작용한다.** alpha를 키우면 영어 PPL은 계속 좋아지지만 한국어 VQA(K-DTCBench)는 값에 관계없이 8~9%p 악화된다. FOEM의 beta 항(직접 오차 피드백)만으로도 이미 충분히 보정되고 있어, 추가로 alpha 보정을 얹으면 오히려 두 보정 항이 간섭해 손실이 커지는 것으로 추정된다. +6. **FOEM beta는 베이스라인(0.2)이 국소 최적점이다.** 0.1과 0.4 모두 베이스라인보다 나쁘고, 낮출수록(0.1) 더 나쁘다 — 오차 피드백을 약화시키는 방향은 확실히 손해라는 뜻이다. +7. **group_size=32는 이번 세션에서 유일하게 성공한 튜닝이다.** PPL -1.02, K-DTCBench +2.50%p를 파일 크기 +5.9%(168MB)만으로 얻었다. alpha·group_size=64 실험과 마찬가지로 PPL과 K-DTCBench가 항상 같은 방향으로 움직이지는 않는다는 게 반복 확인됐지만, group_size=32는 예외적으로 **두 지표 모두 개선**된 유일한 설정이다. +8. **PPL은 다운스트림(K-DTCBench) 성능의 신뢰할 수 있는 대리지표가 아니다.** alpha 실험, group_size=64 실험, mixed-precision 두 조합 전부 PPL 개선이 K-DTCBench 정체·악화와 함께 나타났다. 양자화 설정을 PPL만으로 선택하면 실제 VQA 태스크에서 손해를 볼 수 있다. +9. **mixed-precision 레이어 스킵(gate/up_proj 또는 마지막 6레이어를 4-bit로)은 group_size 축소보다 효과가 약하다.** 두 조합 모두 PPL은 group_size=32와 비슷한 수준으로 개선됐지만 K-DTCBench는 베이스라인을 넘지 못했다 (동률 또는 하락). "일부 민감 모듈만 정밀도를 높이는" 접근보다 "전체 그룹의 스케일 세밀도를 높이는"(group_size 축소) 접근이 이 모델/태스크 조합에서는 더 유효했다. +10. **gptqmodel의 GPTQ v1 포맷 변환 로직이 모듈별 dynamic bit를 무시하는 버그를 발견했다** (7-3절). `format=FORMAT.GPTQ_V2`로 우회 가능하며, mixed-precision(dynamic bits)을 3-bit 베이스와 함께 쓸 때는 항상 이 옵션을 켜야 한다. + +### 다음 단계 + +- act-order, calib-language, alpha/beta, mixed-precision 튜닝은 모두 폐기. +- **group_size=32 (alpha=0.0, beta=0.2, en/c4, desc_act=False)를 최종 후보로 재확정**, 전체 KMMLU(45과목) 재확인 진행. +- group_size=64와 mixed-precision 두 조합은 K-DTCBench 기준 베이스라인과 동률이거나 나빠 채택하지 않음 (참고용으로만 기록). +- 필요 시 group_size=16처럼 더 세밀한 값이나, group_size=32 위에 mixed-precision을 추가로 얹는 조합을 후속 탐색할 수 있으나, 현재로선 group_size=32로 충분한 개선을 확인했으므로 우선순위는 낮음. + +--- + +## 10. 코드 변경 사항 + +`pseudo/quantize_mistral.py`에 추가된 기능 (이번 세션): + +- `--desc-act` 플래그: `QuantizeConfig(desc_act=...)`에 연결. +- `--calib-lang {en,ko}` 플래그: `get_calibration()`이 `(texts, dataset_label)` 튜플을 반환하도록 변경, ko 옵션은 `wikimedia/wikipedia` 스트리밍 + 다양성 샘플링(4-1절) 구현. +- **모든 캘리브레이션 경로(en/ko/fallback)에 공통 길이 캡 `CALIB_MAX_CHARS=2000`자 적용** (5-1절) — 이상치 긴 문서로 인한 OOM을 원천 차단. +- K-DTCBench 자동 평가를 양자화 파이프라인에 통합 (`eval_kdtcbench_quantized()`, `--skip-kdtcbench` 플래그) — 이제 PPL/KMMLU와 동일하게 양자화 직후 자동 평가되고 README에 기록됨. +- 모델 경로 해석 수정: `--model`에 로컬 디렉토리 경로를 직접 넘기면 재다운로드 없이 사용 (HF 허브 리비전 이슈 회피). +- README 생성기(`write_readme`)에 `desc_act` 값과 실제 사용된 캘리브레이션 데이터셋 라벨(`calib_label`)을 동적으로 기록하도록 변경. +- `--mixed-precision {none,modules,layers}` + `--mixed-precision-bits` + `--mixed-precision-last-layers` 플래그: `QuantizeConfig(dynamic=...)`로 모듈 이름 정규식 기반 bit 오버라이드 구성 (7절). +- `--format {gptq,gptq_v2}` 플래그: `QuantizeConfig(format=...)` — mixed-precision 사용 시 v1 변환 버그 우회용 (7-3절). + +### 알려진 라이브러리 버그 (우회, 미수정) + +- `gptqmodel/quantization/foem.py`의 `process_batch()`는 **alpha>0일 때 배치 내 시퀀스 길이가 다르면 `RuntimeError`** 를 낸다 (5-1절). `--batch-size 1`로 우회해야 한다. +- `gptqmodel`의 GPTQ v1 포맷 변환(`convert_gptq_v2_to_v1_format_module`)은 **모듈별 dynamic bit를 무시하고 전역 `bits`를 사용**해 저장 시 `ValueError: qzeros expects columns divisible by N`이 날 수 있다 (7-3절). `--format gptq_v2`로 우회해야 한다. +- 위 두 버그 모두 이 레포에서 수정할 수 없는 gptqmodel 라이브러리 쪽 이슈이며, CLI 플래그로 우회만 제공한다. + +--- + +## 11. 산출물 + +- `pseudo/quantize_mistral.py` — desc_act/calib-lang/길이캡/K-DTCBench/mixed-precision/format 통합 (수정). +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit_kocalib/` — 실험 2 산출 모델 + README. +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit_alpha0.3/`, `_alpha0.6/`, `_beta0.1/`, `_beta0.4/` — 실험 3 산출 모델 + README (각각 PPL/K-DTCBench 섹션 포함). +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit_gs64/`, `_gs32/` — 실험 4 산출 모델 + README. **`_gs32/`가 현재 최종 권장 설정.** +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit_mp_modules/`, `_mp_layers/` — 실험 5 산출 모델 + README. +- `logs/foem_3bit_actorder_kocalib.log` — 실험 1 전체 로그 (OOM 실패 시도 포함, 3-3절 수치의 출처). +- `logs/foem_3bit_kocalib.log` — 실험 2 전체 로그. +- `logs/foem_3bit_alpha0.3.log`, `foem_3bit_alpha0.6.log`, `foem_3bit_beta0.1.log`, `foem_3bit_beta0.4.log` — 실험 3 전체 로그 (OOM/RuntimeError 실패 시도 포함). +- `logs/foem_3bit_gs64.log`, `foem_3bit_gs32.log` — 실험 4 전체 로그. +- `logs/foem_3bit_mp_modules.log`, `foem_3bit_mp_layers.log` — 실험 5 전체 로그 (조합 B는 GPTQ v1 변환 버그로 인한 첫 실패 시도 포함). +- `pseudo/ABLATION_REPORT.md` — 이 파일. + +> **참고**: 실험 1의 모델 디렉토리(`_foem_3bit_actorder_kocalib`)는 실험 2를 재실행하며 실수로 `rm -rf` 되어 디스크에는 남아있지 않다. 3절의 수치는 삭제 전 README와 `logs/foem_3bit_actorder_kocalib.log`에서 확인된 값으로, 로그 파일에 원본 근거가 그대로 남아있다. diff --git a/FOEM/pseudo/KDTCBENCH_REPORT.md b/FOEM/pseudo/KDTCBENCH_REPORT.md new file mode 100644 index 0000000..57a279f --- /dev/null +++ b/FOEM/pseudo/KDTCBENCH_REPORT.md @@ -0,0 +1,245 @@ +# Ministral-3-3B K-DTCBench 평가 비교 보고서 +**BF16 원본 vs GPTQ 4-bit vs FOEM 3-bit (zero-shot, 문서/표/차트 240문항)** + +작성일: 2026-07-08 · 모델: `mistralai/Ministral-3-3B-Instruct-2512-BF16` + +--- + +## 1. 목적 + +[K-DTCBench](https://huggingface.co/datasets/NCSOFT/K-DTCBench)는 한국어 비전-언어 모델이 문서(document)·표(table)·차트(chart) 3가지 유형의 이미지를 얼마나 잘 이해하는지 평가하는 벤치마크다 (디지털 50% + 수기 50% 이미지, 총 240문항 4지선다). KMMLU 평가(`pseudo/KMMLU_REPORT.md`)가 텍스트 전용 지식·추론을 측정했다면, K-DTCBench는 Ministral-3-3B의 **비전 인코더(Pixtral) + 언어 모델 전체 파이프라인**을 평가한다. GPTQ/FOEM 양자화는 텍스트 디코더의 선형 레이어만 대상으로 하고 vision tower는 BF16으로 유지되므로 (`quantize_mistral.py` 참고), 이 벤치마크는 **"이미지에서 뽑아낸 시각 특징을 양자화된 언어 모델이 얼마나 정확히 추론에 활용하는지"**를 드러낸다. + +| 모델 | 양자화 방법 | 비트 | KMMLU 정확도 (참고) | +|---|---|---|---:| +| `Ministral-3-3B-Instruct-2512-BF16` | 없음 (기준) | BF16 | 46.88% | +| `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit` | GPTQ | 4-bit | 44.19% | +| `Ministral-3-3B-Instruct-2512-BF16_foem_3bit` | FOEM (α=0, β=0.2) | 3-bit | 35.58% | + +--- + +## 2. 평가 방법 + +- **데이터셋**: `NCSOFT/K-DTCBench` — 단일 `test` split, 240문항 (document/table/chart 각 80개). `dev` split이 없어 공식 프로토콜과 동일하게 **zero-shot**으로만 평가한다. +- **프롬프트**: 데이터셋 카드가 제시하는 공식 형식을 그대로 사용한다. + ``` + + {question} + Options: A: {choice_a}, B: {choice_b}, C: {choice_c}, D: {choice_d} + + 주어진 선택지 중 해당 옵션의 문자로 바로 답하세요. + ``` + Mistral3 채팅 템플릿(`[INST]...[/INST]`)으로 감싸면 `[/INST]` 직후 공백 없이 바로 `A`/`B`/`C`/`D` 토큰이 이어지는 것을 실측으로 확인했다 (" A"처럼 공백이 붙은 토큰은 별개 id). +- **채점 방식**: KMMLU와 동일하게 log-likelihood 기반 4지선다. `generate()` 호출 없이 `[/INST]` 직후 위치의 logit에서 "A"/"B"/"C"/"D" (공백 없음) 토큰의 확률을 비교해 argmax 선택. +- **구현**: `pseudo/eval_kdtcbench.py`. `AutoProcessor`로 이미지+텍스트를 함께 인코딩하여 `pixel_values`를 모델에 전달한다. +- **양자화 모델 로딩 이슈**: 문서 이미지는 해상도가 높아 vision tower를 `eager` 어텐션으로 돌리면 O(N²) 어텐션 행렬이 12GB VRAM을 초과해 OOM이 발생한다. 반면 GPTQ 4-bit 기본 백엔드(Marlin)는 이 환경(RTX 5070, sm_120/Blackwell)에서 bf16 커널 JIT 컴파일이 실패하고, FOEM 3-bit는 `TritonV2Linear`가 3-bit를 지원하지 않는다. 최종적으로 `attn_implementation="sdpa"` + 커널 자동 선택(`auto → gptq_triton → eager` 순 폴백)으로 4-bit는 Marlin 실패 시 Triton으로, 3-bit는 자동으로 `TorchLinear`로 떨어지도록 구현했다. + +--- + +## 3. 전체 결과 + +| 모델 | 정확도 (micro=macro, n=240) | document (n=80) | table (n=80) | chart (n=80) | 소요 시간 | +|---|---:|---:|---:|---:|---:| +| **BF16 원본** | **62.08%** (149/240) | 71.25% (57/80) | 62.50% (50/80) | 52.50% (42/80) | 1.4분 | +| **GPTQ 4-bit** | **60.83%** (146/240) | 67.50% (54/80) | 65.00% (52/80) | 50.00% (40/80) | 1.4분 | +| **FOEM 3-bit** | **50.83%** (122/240) | 58.75% (47/80) | 56.25% (45/80) | 37.50% (30/80) | 1.5분 | +| 4지선다 무작위 기준선 | 25.00% | 25.00% | 25.00% | 25.00% | - | + +카테고리별 문항 수가 80개씩 균등해 micro==macro accuracy로 일치한다. + +**양자화로 인한 정확도 저하 (BF16 대비)** + +| 모델 | 전체 | document | table | chart | +|---|---:|---:|---:|---:| +| GPTQ 4-bit | -1.25%p | -3.75%p | **+2.50%p** | -2.50%p | +| FOEM 3-bit | -11.25%p | -12.50%p | -6.25%p | **-15.00%p** | + +- GPTQ 4-bit의 전체 손실(-1.25%p)은 KMMLU(-2.69%p)보다 오히려 작다 — table 카테고리에서는 BF16보다 **더 높은** 정확도(+2.50%p)를 기록했다. vision tower가 BF16로 그대로 유지되고 텍스트 디코더만 4-bit로 양자화되므로, "이미지에서 정확한 시각 정보를 뽑아내는" 능력 자체는 거의 보존되는 것으로 보인다. +- FOEM 3-bit는 KMMLU와 마찬가지로 큰 폭의 손실(-11.25%p)을 보이며, 특히 **chart 카테고리에서 -15.00%p로 손실이 가장 크다**. 차트는 막대·선 그래프의 상대적 크기·순서를 비교해야 하는 다단계 추론이 필요한데, 3-bit 양자화로 인한 텍스트 추론 능력 저하가 이 다단계 비교에서 특히 두드러지는 것으로 해석된다. + +--- + +## 4. 카테고리별 분석 + +### 4-1. document (문서) + +| 모델 | 정확도 | +|---|---:| +| BF16 원본 | 71.25% | +| GPTQ 4-bit | 67.50% | +| FOEM 3-bit | 58.75% | + +세 모델 모두 3개 카테고리 중 가장 정확도가 높다 — 문서는 표·차트에 비해 텍스트 비중이 높아 OCR 유사 판독 후 직접적인 텍스트 매칭으로 풀리는 문항이 많기 때문으로 보인다. + +### 4-2. table (표) + +| 모델 | 정확도 | +|---|---:| +| BF16 원본 | 62.50% | +| GPTQ 4-bit | **65.00%** | +| FOEM 3-bit | 56.25% | + +유일하게 GPTQ 4-bit가 BF16을 앞서는 카테고리다 (+2.50%p, n=80이므로 2문항 차이 — 통계적 노이즈일 가능성과 실제 개선 가능성이 병존한다). 표는 행·열 대응이 명확해 특정 셀 값만 정확히 읽으면 되는 경우가 많아, 텍스트 디코더의 양자화 손실이 상대적으로 덜 치명적이었을 수 있다. + +### 4-3. chart (차트) + +| 모델 | 정확도 | +|---|---:| +| BF16 원본 | 52.50% | +| GPTQ 4-bit | 50.00% | +| FOEM 3-bit | **37.50%** | + +세 모델 모두 최저 정확도이며, FOEM 3-bit의 손실도 최대(-15.00%p)다. 차트는 막대 높이·선 기울기 비교, 범례-데이터 매핑 등 시각 정보를 종합해 추론해야 하는 문항이 많아 3B 규모 모델의 근본적 한계와 양자화 손실이 함께 작용하는 것으로 보인다. + +### 4-4. 모델 간 정답/오답 일치도 (n=240) + +| 패턴 | 문항 수 | 비율 | +|---|---:|---:| +| 세 모델 모두 정답 | 101 | 42.1% | +| 세 모델 모두 오답 | 67 | 27.9% | +| BF16+GPTQ 정답, FOEM만 오답 | 31 | 12.9% | +| BF16만 정답 | 10 | 4.2% | +| GPTQ만 정답 | 10 | 4.2% | +| FOEM만 정답 | 10 | 4.2% | +| BF16+FOEM 정답, GPTQ만 오답 | 7 | 2.9% | +| GPTQ+FOEM 정답, BF16만 오답 | 4 | 1.7% | + +- BF16이 GPTQ보다 나은 문항 17개 vs GPTQ가 BF16보다 나은 문항 14개 → 순 우위 +3문항으로 거의 대등하다. +- BF16이 FOEM보다 나은 문항 41개 vs FOEM이 BF16보다 나은 문항 14개 → 순 우위 +27문항으로, FOEM 3-bit의 손실이 명확하다. +- "세 모델 모두 오답"이 27.9%에 달해, 상당수 문항은 양자화와 무관하게 **3B 모델 자체의 시각 추론 한계**임을 시사한다 (KMMLU의 Math 과목과 유사한 패턴). + +--- + +## 5. 실제 질의 / 추론 예시 + +동일한 zero-shot 프롬프트와 이미지로 세 모델을 질의하고 "A"~"D" 토큰 확률분포를 비교했다. + +### 5-1. document_0 (세 모델 모두 정답, 확신도 역전) + +> **질문**: 보고서의 주요 내용이 아닌 것은 무엇인가요? +> - A. 안전 인프라 확충 B. 재난 및 사고 예방 체계 구축 C. 시민 안전 교육 강화 D. 긴급 대응 시스템 개선 +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **B** | 44.8% | **50.8%** | 2.9% | 1.5% | ✓ | +| GPTQ 4-bit | **B** | 20.5% | **71.5%** | 6.6% | 1.4% | ✓ | +| FOEM 3-bit | **B** | 26.9% | **64.5%** | 5.6% | 3.0% | ✓ | + +세 모델 모두 정답을 맞혔지만, KMMLU 보고서의 일반적 패턴(BF16이 가장 확신)과 달리 여기서는 **GPTQ 4-bit(71.5%)가 BF16(50.8%)보다 더 확신에 찬 정답**을 냈다. BF16은 오답 A에도 44.8%를 배분해 두 선택지 사이에서 흔들렸다. + +### 5-2. document_11 (BF16만 정답 — 세부 정보 판독 실패) + +> **질문**: 해당 문서의 내용과 비교하였을때, 옳지 않은 선택지는 무엇인가요? +> - A. 신년맞이 콘서트는 2023년 12월 31일 오후 8시에 개최된다. +> - B. 콘서트의 개최 장소는 서울 올림픽 공원 체조경기장이다. +> - C. 티켓의 QR코드가 첨부되어 있다. +> - D. 좌석은 VIP석 B열 15번이다. +> +> **정답: D** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 0.1% | 2.6% | 0.8% | **96.6%** | ✓ | +| GPTQ 4-bit | **C** | 0.7% | 6.9% | **65.2%** | 27.2% | ✗ | +| FOEM 3-bit | **C** | 2.7% | 4.0% | **58.1%** | 35.2% | ✗ | + +BF16은 96.6%의 확신으로 정답(D, 좌석 정보 불일치)을 맞혔지만, 두 양자화 모델은 모두 C(QR코드 유무)로 예측이 뒤바뀐다. 이미지 내 좌석 번호처럼 **작은 글씨의 세부 텍스트를 정밀하게 읽어야 하는 문항에서 텍스트 디코더 양자화가 시각 특징 활용의 정밀도를 떨어뜨리는** 사례로 보인다. + +### 5-3. table_43 (BF16만 정답 — 표 안 숫자값 오독) + +> **질문**: 2023년 시내버스 요금은 얼마입니까? +> - A. 850원 B. 1000원 C. 1200원 D. 1300원 +> +> **정답: D** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 0.0% | 0.1% | 18.2% | **81.7%** | ✓ | +| GPTQ 4-bit | **C** | 0.0% | 7.0% | **85.1%** | 7.9% | ✗ | +| FOEM 3-bit | **C** | 0.7% | 7.1% | **49.0%** | 43.2% | ✗ | + +document_11과 동일한 구조 — BF16은 정답에 81.7%로 확신했지만, GPTQ는 오히려 오답 C에 85.1%라는 더 높은 확신을 보인다. 표에서 인접한 숫자값(1200원 vs 1300원)을 구분하는 정밀도가 4-bit 양자화로 손상된 사례다. + +### 5-4. chart_27 (BF16만 정답 — 양자화가 확신에 찬 오답을 유발) + +> **질문**: 15-24세 연령대에서 가장 많이 사용하는 SNS 플랫폼은 무엇인가요? +> - A. 페이스북 B. 인스타그램 C. 트위터 D. 틱톡 +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **B** | 1.1% | **98.2%** | 0.5% | 0.2% | ✓ | +| GPTQ 4-bit | **A** | **67.7%** | 32.0% | 0.1% | 0.1% | ✗ | +| FOEM 3-bit | **A** | **87.7%** | 9.8% | 1.3% | 1.2% | ✗ | + +BF16은 98.2%라는 거의 확정적인 확신으로 정답을 맞혔지만, GPTQ·FOEM은 모두 A로 예측이 뒤집히며 비트 수가 낮을수록(FOEM 87.7% > GPTQ 67.7%) 오답에 대한 확신도 더 커진다. 차트 막대의 상대적 높이를 비교하는 시각 판독이 텍스트 디코더 양자화만으로도 완전히 다른 결론으로 이어질 수 있음을 보여준다. + +### 5-5. document_20 (BF16만 정답 — 양자화 모델의 극단적 과확신) + +> **질문**: 보고서에서 하천 오염도를 어떻게 예상하고 있나요? +> - A. 5% 상승 B. 5% 하락 C. 10% 상승 D. 10% 하락 +> +> **정답: A** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **A** | **85.3%** | 3.1% | 11.5% | 0.0% | ✓ | +| GPTQ 4-bit | **C** | 5.5% | 2.3% | **92.1%** | 0.0% | ✗ | +| FOEM 3-bit | **C** | 3.3% | 7.5% | **80.2%** | 9.0% | ✗ | + +BF16(85.3%)과 GPTQ(92.1%로 오답 C)가 서로 정반대 방향으로 강하게 확신하는 사례다. 수치의 크기(5% vs 10%)만 다른 선택지를 구분하는 문항으로, document_11·table_43과 함께 **"근소하게 다른 숫자/텍스트를 정밀 판독해야 하는 문항"에서 텍스트 디코더 양자화가 오히려 확신도를 오답 쪽으로 증폭시키는 공통 패턴**을 보여준다. + +### 5-6. document_41 (FOEM만 정답 — 양자화가 우연히 도움된 사례) + +> **질문**: 회사의 1년 총 순이익은 얼마인가요? +> - A. 800억원 B. 900억원 C. 1000억원 D. 1100억원 +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **C** | 0.9% | 29.3% | **45.4%** | 24.3% | ✗ | +| GPTQ 4-bit | **C** | 1.0% | 34.3% | **44.0%** | 20.8% | ✗ | +| FOEM 3-bit | **B** | 1.4% | **53.1%** | 15.2% | 30.3% | ✓ | + +BF16과 GPTQ는 모두 인접값 C(1000억원)로 오답이지만, FOEM 3-bit만 정답(B, 900억원)을 맞혔다. KMMLU 보고서의 Education 예시(5-5)와 같은 구조 — **문항 전체 통계로는 FOEM이 가장 낮은 정확도(document 58.75%)지만, 개별 문항에서는 저비트 양자화가 우연히 더 나은 예측을 내는 경우가 존재**한다. + +### 5-7. table_12 (FOEM만 정답 — 확률 분산 패턴 역전) + +> **질문**: 주거지역의 행정구역에 포함되지 않는 것은? +> - A. 학교 B. 상가 C. 공원 D. 아파트단지 +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **C** | 1.6% | 13.0% | **84.6%** | 0.8% | ✗ | +| GPTQ 4-bit | **C** | 3.6% | 38.3% | **55.7%** | 2.4% | ✗ | +| FOEM 3-bit | **B** | 24.1% | **57.7%** | 11.4% | 6.9% | ✓ | + +BF16 → GPTQ → FOEM 순으로 오답 C에 대한 확신이 84.6% → 55.7% → 11.4%로 점차 낮아지고, 정답 B에 대한 확신은 13.0% → 38.3% → 57.7%로 점차 높아지는 **선형적 역전 패턴**이 뚜렷하다. document_41과 마찬가지로 텍스트 카테고리 판단(행정구역 vs 시설물 분류)이 관련된 문항으로, 시각 판독보다 언어적 상식 추론에 가까운 문항에서는 저비트 양자화가 오히려 유리하게 작용하기도 한다는 점을 시사한다 (단, n=1 사례이므로 일반화에는 주의가 필요하다). + +--- + +## 6. 결론 + +1. **BF16 원본(62.08%)이 기준선**이며, GPTQ 4-bit는 -1.25%p, FOEM 3-bit는 -11.25%p 손실을 보인다. KMMLU(-2.69%p / -11.30%p)와 비교하면 **GPTQ 4-bit의 K-DTCBench 손실이 KMMLU보다 오히려 작다** — vision tower가 BF16로 유지되고 텍스트 디코더만 4-bit로 양자화되므로, 시각 정보 추출 자체는 잘 보존되는 것으로 보인다. FOEM 3-bit는 두 벤치마크 모두에서 비슷한 폭(-11%p대)의 손실을 보여, 3-bit 양자화의 손실은 태스크 유형과 무관하게 일관되게 크다. +2. **카테고리별로는 chart가 가장 취약**하다 (BF16 52.50% — 3개 중 최저, FOEM 손실도 -15.00%p로 최대). 다단계 시각 비교·추론이 필요한 차트 문항이 3B 규모 모델과 저비트 양자화의 이중 한계에 가장 취약함을 시사한다. +3. **table 카테고리에서는 GPTQ 4-bit가 BF16을 앞선다** (+2.50%p, n=80 기준 2문항 차이). 표는 셀 단위로 값이 명확히 분리되어 있어 양자화 손실의 영향이 상대적으로 작을 수 있으나, 표본 크기가 작아 노이즈일 가능성도 배제할 수 없다. +4. **"근소하게 다른 숫자/텍스트를 정밀 판독해야 하는 문항"(5-2, 5-3, 5-5)에서 텍스트 디코더 양자화가 확신도를 오답 쪽으로 크게 증폭시키는 공통 패턴**이 관찰된다 — BF16이 90%대로 확신하던 정답을, 양자화 모델이 80~90%대로 확신하며 정반대 오답을 고르는 사례가 반복된다. +5. **세 모델 모두 오답인 문항이 27.9%**에 달해, K-DTCBench의 상당 부분은 양자화와 무관한 **3B 모델 자체의 시각 추론 한계**임을 보여준다 (KMMLU의 Math 과목과 유사). +6. **후속 실험 제안**: ① 디지털 vs 수기(handwritten) 이미지 하위 그룹 분리 평가 (현재 로드된 데이터셋 컬럼에는 해당 구분이 노출되어 있지 않아 추가 메타데이터 확인 필요); ② 동일 비트 FOEM vs GPTQ 비교; ③ chart 카테고리 전용 chain-of-thought 프롬프트 실험. + +--- + +## 7. 산출물 + +- `pseudo/eval_kdtcbench.py` — 독립 실행형 K-DTCBench 평가 스크립트 (BF16 원본 및 양자화 모델 모두 지원). +- `pseudo/collect_kdtcbench_predictions.py` — 3-way 확률분포 수집 스크립트, `logs/kdtcbench_predictions.json` 산출. +- `logs/base_kdtcbench.log`, `logs/gptq_kdtcbench.log`, `logs/foem_kdtcbench.log` — 모델별 평가 원본 로그. +- `logs/kdtcbench_predictions.json` — 240문항 × 3모델 전체 예측/확률분포 (보고서 5절 예시 선정에 사용). +- `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md` — `## K-DTCBench 평가 결과` 섹션 포함. +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md` — 동일. +- `pseudo/KDTCBENCH_REPORT.md` — 이 파일. diff --git a/FOEM/pseudo/KMMLU_REPORT.md b/FOEM/pseudo/KMMLU_REPORT.md new file mode 100644 index 0000000..2824b05 --- /dev/null +++ b/FOEM/pseudo/KMMLU_REPORT.md @@ -0,0 +1,279 @@ +# Ministral-3-3B KMMLU 평가 비교 보고서 +**BF16 원본 vs GPTQ 4-bit vs FOEM 3-bit (5-shot, KMMLU 45개 과목 전체)** + +작성일: 2026-07-01 · 모델: `mistralai/Ministral-3-3B-Instruct-2512-BF16` + +--- + +## 1. 목적 + +WikiText-2 perplexity와 KMMLU 정확도를 세 가지 모델 변형에 걸쳐 비교한다: ① **BF16 원본** (비양자화, 기준선), ② **GPTQ 4-bit**, ③ **FOEM 3-bit** (α=0, β=0.2). 이를 통해 각 양자화 방법이 한국어 도메인 지식·추론 능력을 얼마나 보존/손실시키는지 정량화한다. + +| 모델 | 양자화 방법 | 비트 | WikiText-2 PPL | +|---|---|---|---| +| `Ministral-3-3B-Instruct-2512-BF16` | 없음 (기준) | BF16 | N/A | +| `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit` | GPTQ | 4-bit | 8.72 | +| `Ministral-3-3B-Instruct-2512-BF16_foem_3bit` | FOEM (α=0, β=0.2) | 3-bit | 10.87 | + +--- + +## 2. 평가 방법 + +- **데이터셋**: `HAERAE-HUB/KMMLU` — 단일 "All" config 없음, 45개 과목별 config 순회 누적. +- **Few-shot**: 5-shot (각 과목 `dev` split 5문항, KMMLU 공식 벤치마크와 동일 설정). +- **채점 방식**: log-likelihood 기반 4지선다 (generate() 없음). 5-shot 프롬프트 뒤에서 " A"/" B"/" C"/" D" 토큰의 logit argmax. +- **구현**: `pseudo/eval_kmmlu.py`. BF16 원본은 `Mistral3ForConditionalGeneration.from_pretrained()` + `tie_weights()` 호출, 양자화 모델은 `GPTQModel.load()` + `.model` 추출 패턴. + +--- + +## 3. 전체 결과 + +| 모델 | 정확도 (micro) | 정확도 (macro) | 소요 시간 | 문항 수 | +|---|---:|---:|---:|---:| +| **BF16 원본** | **46.88%** | 46.02% | 47.1분 | 35,030 | +| **GPTQ 4-bit** | **44.19%** | 43.42% | 62.4분 | 35,030 | +| **FOEM 3-bit** | **35.58%** | 35.03% | 64.9분 | 35,030 | +| 4지선다 무작위 기준선 | 25.00% | 25.00% | - | - | + +**양자화로 인한 정확도 저하 (BF16 대비)** + +| 모델 | micro 차이 | macro 차이 | +|---|---:|---:| +| GPTQ 4-bit | -2.69%p | -2.60%p | +| FOEM 3-bit | -11.30%p | -10.99%p | + +--- + +## 4. 과목별 분석 + +
45개 과목 전체 3-way 비교 표 + +| 과목 | BF16 | GPTQ 4-bit | FOEM 3-bit | 문항 수 | +|---|---:|---:|---:|---:| +| Accounting | 41.0% | 37.0% | 37.0% | 100 | +| Agricultural-Sciences | 37.7% | 36.1% | 28.0% | 1000 | +| Aviation-Engineering-and-Maintenance | 44.7% | 41.5% | 35.3% | 1000 | +| Biology | 38.9% | 36.9% | 28.8% | 1000 | +| Chemical-Engineering | 49.8% | 47.3% | 37.0% | 1000 | +| Chemistry | 51.8% | 48.0% | 36.5% | 600 | +| Civil-Engineering | 44.2% | 41.5% | 31.3% | 1000 | +| Computer-Science | 72.0% | 69.2% | 54.1% | 1000 | +| Construction | 36.8% | 34.4% | 32.3% | 1000 | +| Criminal-Law | 34.0% | 33.5% | 27.5% | 200 | +| Ecology | 48.7% | 45.8% | 31.4% | 1000 | +| Economics | 46.9% | 46.9% | 39.2% | 130 | +| Education | 64.0% | 58.0% | 37.0% | 100 | +| Electrical-Engineering | 35.3% | 34.3% | 26.4% | 1000 | +| Electronics-Engineering | 54.5% | 52.9% | 37.9% | 1000 | +| Energy-Management | 34.0% | 33.1% | 27.5% | 1000 | +| Environmental-Science | 35.0% | 30.4% | 25.2% | 1000 | +| Fashion | 46.4% | 44.6% | 35.1% | 1000 | +| Food-Processing | 43.6% | 41.9% | 34.4% | 1000 | +| Gas-Technology-and-Engineering | 39.9% | 36.4% | 30.3% | 1000 | +| Geomatics | 44.5% | 39.8% | 32.6% | 1000 | +| Health | 64.0% | 55.0% | 37.0% | 100 | +| Industrial-Engineer | 44.3% | 40.5% | 33.0% | 1000 | +| Information-Technology | 69.1% | 64.4% | 49.1% | 1000 | +| Interior-Architecture-and-Design | 53.2% | 50.8% | 41.2% | 1000 | +| Law | 45.7% | 42.6% | 33.3% | 1000 | +| Machine-Design-and-Manufacturing | 44.4% | 42.8% | 34.4% | 1000 | +| Management | 53.9% | 49.0% | 41.6% | 1000 | +| Maritime-Engineering | 47.0% | 44.8% | 35.2% | 600 | +| Marketing | 75.4% | 74.9% | 59.9% | 1000 | +| Materials-Engineering | 48.9% | 44.8% | 35.5% | 1000 | +| Mechanical-Engineering | 43.0% | 39.4% | 32.1% | 1000 | +| Nondestructive-Testing | 47.4% | 45.4% | 36.6% | 1000 | +| Patent | 28.0% | 32.0% | 25.0% | 100 | +| Political-Science-and-Sociology | 52.0% | 47.3% | 38.0% | 300 | +| Psychology | 45.5% | 43.2% | 34.6% | 1000 | +| Public-Safety | 39.8% | 38.1% | 28.9% | 1000 | +| Railway-and-Automotive-Engineering | 40.5% | 38.6% | 31.9% | 1000 | +| Real-Estate | 38.5% | 38.5% | 36.5% | 200 | +| Refrigerating-Machinery | 37.2% | 32.7% | 28.2% | 1000 | +| Social-Welfare | 55.8% | 52.6% | 38.6% | 1000 | +| Taxation | 38.0% | 40.0% | 32.5% | 200 | +| Telecommunications-and-Wireless-Technology | 59.0% | 55.5% | 41.3% | 1000 | +| Korean-History | 33.0% | 27.0% | 33.0% | 100 | +| Math | 23.7% | 24.3% | 23.7% | 300 | + +
+ +### BF16 대비 GPTQ가 크게 저하된 과목 (top 5 손실) + +| 과목 | BF16 | GPTQ | 차이 | 문항 수 | +|---|---:|---:|---:|---:| +| Health | 64.0% | 55.0% | -9.0%p | 100 | +| Education | 64.0% | 58.0% | -6.0%p | 100 | +| Korean-History | 33.0% | 27.0% | -6.0%p | 100 | +| Management | 53.9% | 49.0% | -4.9%p | 1000 | +| Geomatics | 44.5% | 39.8% | -4.7%p | 1000 | + +### BF16 대비 FOEM이 크게 저하된 과목 (top 5 손실) + +| 과목 | BF16 | FOEM | 차이 | 문항 수 | +|---|---:|---:|---:|---:| +| Education | 64.0% | 37.0% | -27.0%p | 100 | +| Health | 64.0% | 37.0% | -27.0%p | 100 | +| Information-Technology | 69.1% | 49.1% | -20.0%p | 1000 | +| Computer-Science | 72.0% | 54.1% | -17.9%p | 1000 | +| Telecommunications-and-Wireless-Technology | 59.0% | 41.3% | -17.7%p | 1000 | + +- BF16이 GPTQ를 앞서는 과목: **40/45개**, BF16이 FOEM을 앞서는 과목: **43/45개**. + +--- + +## 5. 실제 질의 / 추론 예시 + +동일한 5-shot 프롬프트로 세 모델에 같은 문항(각 과목 test[0])을 질의하고, " A"~" D" 중 어디에 가장 높은 확률을 두었는지 비교했다. + +### 5-1. Korean-History (세 모델 모두 오답, 정답 C에 대한 확신도 비교) + +> **질문**: 밑줄 친 '왕'의 재위 기간에 있었던 사실로 옳은 것은? 왕은 노론과 소론, 남인을 두루 등용하였으며 젊은 관료들을 재교육하기 위해 초계문신제를 시행하였다. 또 서얼 출신의 유능한 인사를 규장각 검서관으로 등용하였다. +> - A. 동학이 창시되었다. +> - B. 대전회통이 편찬되었다. +> - C. 신해통공이 시행되었다. +> - D. 홍경래의 난이 발생하였다. +> +> **정답: C** (정조 시대 — 신해통공 시행) + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **B** | 9.8% | **49.5%** | 14.2% | 26.5% | ✗ | +| GPTQ 4-bit | **B** | 18.8% | **45.2%** | 14.7% | 21.3% | ✗ | +| FOEM 3-bit | **B** | 17.9% | 29.5% | 23.0% | 29.5% | ✗ | + +세 모델 모두 정조(규장각·초계문신제)를 영조·순조 시기 정책과 혼동해 오답(B, "대전회통" — 고종 대 편찬)을 골랐다. BF16이 B에 49.5%로 가장 높은 확신을 보인 반면, FOEM은 B와 D에 확률이 분산되어 정답 C에 상대적으로 높은 23.0%를 배분했다. **3B 모델 자체가 이 문항에서 틀리는 것이며, 양자화로 오답이 생긴 게 아님을 확인할 수 있다.** + +### 5-2. Math (세 모델 모두 오답, 무작위에 가까운 분포) + +> **질문**: 함수 f(x)=-x³+2x+3에 대하여 직선 y=-x+k와 곡선 y=f(x)의 그래프가 서로 다른 두 점에서 만나도록 하는 모든 양수 k의 합은? +> - A. 6 B. 12 C. 18 D. 36 +> +> **정답: A** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 9.4% | 28.9% | 28.9% | **32.8%** | ✗ | +| GPTQ 4-bit | **B** | 12.6% | **34.2%** | 26.6% | 26.6% | ✗ | +| FOEM 3-bit | **D** | 18.6% | 27.0% | 23.8% | **30.6%** | ✗ | + +세 모델 모두 정답(A)에 낮은 확률을 부여하고 B·C·D에 고르게 분산돼 있다 — 베이스 모델(BF16)도 동일하게 틀리므로, 이는 **양자화 손실이 아닌 3B 규모 모델의 수리 추론 한계**에 기인한다. + +### 5-3. Computer-Science (세 모델 모두 정답, BF16이 가장 확신) + +> **질문**: NTFS 파일시스템에서 부팅과정에서 읽어들이는 부분으로 디스크에 저장되어 있는 파일의 정보DB를 담아 놓은 것은? +> - A. VFAT B. MFT C. PROM D. CMOS +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **B** | 0.1% | **99.2%** | 0.4% | 0.3% | ✓ | +| GPTQ 4-bit | **B** | 0.2% | **97.9%** | 1.4% | 0.6% | ✓ | +| FOEM 3-bit | **B** | 14.5% | **69.3%** | 8.8% | 7.3% | ✓ | + +사실 기반(factoid) 문항에서는 세 모델 모두 정답을 맞혔다. BF16(99.2%) > GPTQ(97.9%) > FOEM(69.3%) 순으로 확신도가 낮아지는 패턴이 명확하며, 양자화 수준이 낮을수록(비트 수 감소) 분포가 넓어지는(less sharp) 경향을 보인다. + +### 5-4. Marketing (세 모델 모두 오답, 양자화 심화될수록 과확신 심화) + +> **질문**: 표본을 통해서 모집단의 성질을 정확히 추론하기 위하여 고려할 사항으로 중요하지 않은 것은? +> - A. 모집단 요소들의 동질성 정도 B. 표본의 크기 C. 표본선정 시기 D. 표본조사 예산 +> +> **정답: C** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 1.3% | 1.0% | 36.9% | **60.8%** | ✗ | +| GPTQ 4-bit | **D** | 1.6% | 1.8% | 28.4% | **68.2%** | ✗ | +| FOEM 3-bit | **D** | 3.7% | 1.3% | 4.8% | **90.2%** | ✗ | + +세 모델 모두 오답(D)을 골랐지만, BF16은 정답(C)에 36.9%를 분산해 두었고 GPTQ는 28.4%, FOEM은 4.8%에 불과하다. 즉 **BF16 → GPTQ → FOEM 순서로 오답에 대한 과확신(overconfidence)이 심화**되는 패턴이 뚜렷하다. FOEM 3-bit의 경우 D에 90.2%를 몰아 정답을 사실상 배제했다 — 비트 감소에 따른 확률 분포 왜곡이 누적되는 사례다. + +### 5-5. Education (FOEM만 정답 — 양자화가 오히려 도움이 된 사례) + +> **질문**: 항존주의 교육철학에 대한 설명으로 옳은 것은? +> - A. 아동 존중의 원리를 채택한다. +> - B. 교육을 통한 사회 개조를 중시한다. +> - C. 지식이나 진리의 영원성을 강조한다. +> - D. 실제적인 삶의 문제를 해결하는 데 초점을 둔다. +> +> **정답: C** (항존주의 — 불변하는 지식·진리 강조) + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 13.0% | 2.3% | 18.9% | **65.9%** | ✗ | +| GPTQ 4-bit | **D** | 19.7% | 5.3% | 6.0% | **68.9%** | ✗ | +| FOEM 3-bit | **C** | 13.4% | 7.2% | **60.0%** | 19.5% | ✓ | + +BF16과 GPTQ는 모두 D를 골라 오답이지만, FOEM 3-bit는 C를 60.0%의 확신으로 정답을 맞혔다. GPTQ는 오히려 C 확률을 18.9% → 6.0%로 낮춰 정답에서 더 멀어졌다. 이처럼 **특정 문항에서 낮은 비트 양자화가 우연히 더 나은 예측을 내는 사례**가 존재한다 — 단, 과목 전체 정확도는 BF16(64%) > GPTQ(58%) > FOEM(37%)이므로 이 문항은 FOEM에게 운 좋은 예외에 해당한다. + +### 5-6. Patent (세 모델 모두 정답, 확신도 순차 감소) + +> **질문**: 의사표시의 효력발생에 관한 설명으로 옳지 않은 것은? +> - A. 준법률행위의 도달은 … 객관적 상태에 놓여졌을 때를 말한다. +> - B. 의사표시의 상대방이 정당한 사유 없이 통지의 수령을 거절한 경우 … 효력이 발생한다. +> - C. 채권양도의 통지는 채무자의 주소 등에 해당하지 아니하는 장소에서라도 … 효력이 발생한다. +> - D. 보통우편의 방법으로 의사표시를 통지한 경우에도 발송되었다는 사실만 증명되면, 상당한 기간 내에 도달한 것으로 추정된다. +> +> **정답: D** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 6.1% | 4.8% | 4.2% | **84.8%** | ✓ | +| GPTQ 4-bit | **D** | 11.2% | 14.4% | 9.9% | **64.5%** | ✓ | +| FOEM 3-bit | **D** | 27.8% | 11.6% | 14.9% | **45.8%** | ✓ | + +세 모델 모두 정답(D)을 골랐으나, 정답 확률이 BF16(84.8%) → GPTQ(64.5%) → FOEM(45.8%)로 비트 감소에 따라 선형적으로 낮아지는 패턴이 뚜렷하다. Computer-Science 예시(5-3)와 동일한 구조로, **사실·법령 기반 문항에서는 비트 수가 낮아질수록 확신도가 감소하지만 정답 선택 자체는 유지**된다. + +### 5-7. Law (세 모델 모두 오답, 각자 다른 선택지 선택) + +> **질문**: 경비업법령상 경비원의 명부와 배치 등에 관한 설명으로 옳은 것은? +> - A. 경비업자는 주된 사무소, 출장소, 집단민원현장에 경비원의 명부를 작성·비치하여 두고 이를 항상 정리해야 한다. +> - B. 경비업자는 경비원을 배치하여 … 근무상황기록부를 작성하여 2년 동안 보관해야 한다. +> - C. 경비업자는 형법상 상해죄 또는 폭행죄를 범하여 벌금형을 선고받고 7년이 지나지 아니한 자를 집단민원현장에 일반경비원으로 배치하여서는 아니 된다. +> - D. 관할 경찰관서장은 경비원이 위력이나 흉기 … 집단적 폭력사태를 일으킨 때에는 경비업의 허가를 취소해야 한다. +> +> **정답: C** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **A** | **66.1%** | 13.0% | 16.7% | 4.2% | ✗ | +| GPTQ 4-bit | **A** | **37.4%** | 20.0% | 33.0% | 9.5% | ✗ | +| FOEM 3-bit | **D** | 22.6% | 8.3% | 21.2% | **47.8%** | ✗ | + +세 모델이 각기 다른 오답을 골라, 세부 법령 지식이 전반적으로 취약하다는 것을 보여준다. BF16은 A에 66.1%로 매우 과확신하지만, GPTQ는 A(37.4%)와 C(33.0%)가 거의 균등해 오히려 정답에 더 가까운 분포를 보인다 — **이 문항에서는 GPTQ가 BF16보다 덜 확신에 찬 오답**을 낸 사례다. FOEM은 D로 완전히 다른 방향으로 이탈한다. + +### 5-8. Information-Technology (FOEM만 오답, 정답 확률 순위 역전) + +> **질문**: 일반적인 로더(general loader)에 가장 가까운 것은? +> - A. Direct Loader B. Absolute Loader C. Compile And Go Loader D. Direct Linking Loader +> +> **정답: D** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| BF16 원본 | **D** | 24.6% | 14.9% | 24.6% | **35.8%** | ✓ | +| GPTQ 4-bit | **D** | 27.8% | 19.1% | 21.6% | **31.5%** | ✓ | +| FOEM 3-bit | **C** | 25.4% | 22.4% | **36.9%** | 15.4% | ✗ | + +BF16과 GPTQ는 낮은 확신(35.8%, 31.5%)이지만 정답(D)을 유지한 반면, FOEM은 D 확률이 15.4%로 급락하며 C(36.9%)로 예측이 역전됐다. 3-bit 양자화로 인해 **가중치 정밀도 손실이 확률 순위 자체를 바꿔버린** 사례로, 단순히 확신도가 줄어드는 게 아니라 예측 방향이 바뀔 수 있음을 보여준다. + +--- + +## 6. 결론 + +1. **BF16 원본(46.88%)이 기준선**이며, GPTQ 4-bit는 -2.69%p, FOEM 3-bit는 -11.30%p 차이를 보인다. 비트 수가 더 낮은 FOEM 3-bit의 손실이 더 크며, 이는 PPL 결과(8.72 vs 10.87)와 같은 방향이다. +2. **GPTQ vs FOEM 알고리즘 비교**: GPTQ 4-bit가 FOEM 3-bit보다 micro +8.61%p 높지만, 이는 알고리즘 차이가 아닌 **비트 수 차이(4 vs 3)**가 주된 원인일 가능성이 높다. 공정한 비교를 위해 동일 비트(4-bit FOEM vs 4-bit GPTQ, 3-bit FOEM vs 3-bit GPTQ) 실험이 필요하다. +3. **Math 과목**은 세 모델 모두 무작위 기준선(25%) 수준으로, 양자화 손실보다 **3B 베이스 모델의 수리 추론 한계**가 더 크게 작용한다. +4. **Korean-History**는 BF16(33%)·FOEM(33%)이 GPTQ(27%)를 역전하는 패턴이 실제로 확인됐다. 예시 문항(5-1)에서도 세 모델 모두 동일 오답(B)을 골라 이는 베이스 모델 자체의 한국사 지식 한계이며, GPTQ에서 특정 지식이 더 손실되는 방향으로 작동한 것으로 추정된다 (n=100으로 노이즈 가능성 병존). +5. **후속 실험 제안**: ① 동일 비트 FOEM vs GPTQ 비교; ② Math 과목을 위한 chain-of-thought 프롬프트 실험; ③ Calibration curve (confidence vs accuracy) 분석으로 과확신(overconfident) 오답 패턴 정량화. + +--- + +## 7. 산출물 + +- `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md` — `## KMMLU 평가 결과` 섹션 포함. +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md` — 동일. +- `pseudo/eval_kmmlu.py` — 독립 실행형 KMMLU 평가 스크립트 (BF16 원본 및 양자화 모델 모두 지원). +- `pseudo/quantize_mistral.py` — `eval_kmmlu_quantized()` 통합. +- `pseudo/KMMLU_REPORT.md` — 이 파일 (3-way 비교, 베이스 모델 포함). diff --git a/FOEM/pseudo/collect_base_examples.py b/FOEM/pseudo/collect_base_examples.py new file mode 100644 index 0000000..e846a75 --- /dev/null +++ b/FOEM/pseudo/collect_base_examples.py @@ -0,0 +1,91 @@ +#!/usr/bin/env -S python -u +"""보고서 섹션 5용: BF16 베이스 모델로 4개 예시 문항의 A/B/C/D 확률분포 수집.""" +import os +import torch +import torch.nn.functional as F +from datasets import load_dataset +from transformers import AutoTokenizer, AutoConfig + +BASE_PATH = "/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88" +CHOICE_LETTERS = ["A", "B", "C", "D"] +SUBJECTS = ["Korean-History", "Math", "Computer-Science", "Marketing"] + + +def load_base_model(): + cfg = AutoConfig.from_pretrained(BASE_PATH) + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + BASE_PATH, config=cfg, dtype=torch.bfloat16, + device_map="auto", attn_implementation="sdpa" + ) + hf.tie_weights() + hf.eval() + return hf + + +def _format_choices(ex): + return "\n".join(f"{l}. {ex[l]}" for l in CHOICE_LETTERS) + + +def _format_q(ex, with_answer): + text = f"{ex['question']}\n{_format_choices(ex)}\n정답:" + if with_answer: + text += f" {CHOICE_LETTERS[ex['answer'] - 1]}" + return text + + +def build_prefix(subject): + dev = load_dataset("HAERAE-HUB/KMMLU", subject, split="dev") + return "\n\n".join(_format_q(ex, True) for ex in dev.select(range(5))) + "\n\n" + + +@torch.inference_mode() +def predict(hf, tok, subject): + prefix = build_prefix(subject) + test = load_dataset("HAERAE-HUB/KMMLU", subject, split="test") + ex = test[0] + + prompt = prefix + _format_q(ex, False) + input_ids = tok(prompt, return_tensors="pt").input_ids.to(next(hf.parameters()).device) + logits = hf(input_ids=input_ids).logits[0, -1, :] + + choice_ids = [tok.encode(f" {l}", add_special_tokens=False)[0] for l in CHOICE_LETTERS] + choice_logits = torch.stack([logits[i] for i in choice_ids]) + probs = F.softmax(choice_logits.float(), dim=0) + pred_idx = int(probs.argmax()) + + return { + "subject": subject, + "question": ex["question"], + "choices": {l: ex[l] for l in CHOICE_LETTERS}, + "answer": CHOICE_LETTERS[ex["answer"] - 1], + "pred": CHOICE_LETTERS[pred_idx], + "probs": {l: float(probs[i]) * 100 for i, l in enumerate(CHOICE_LETTERS)}, + "correct": pred_idx == ex["answer"] - 1, + } + + +def main(): + tok = AutoTokenizer.from_pretrained(BASE_PATH) + hf = load_base_model() + + results = [] + for subj in SUBJECTS: + r = predict(hf, tok, subj) + results.append(r) + mark = "✓" if r["correct"] else "✗" + print(f"[{subj}] pred={r['pred']} answer={r['answer']} {mark}") + for l in CHOICE_LETTERS: + print(f" {l}: {r['probs'][l]:.1f}%") + + # 마크다운 행 출력 (보고서 붙여넣기용) + print("\n--- 마크다운 행 (BF16 추가분) ---") + for r in results: + mark = "✓" if r["correct"] else "✗" + ps = r["probs"] + print(f"| BF16 원본 | **{r['pred']}** | {ps['A']:.1f}% | {ps['B']:.1f}% | {ps['C']:.1f}% | {ps['D']:.1f}% | {mark} |") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/collect_extra_examples.py b/FOEM/pseudo/collect_extra_examples.py new file mode 100644 index 0000000..2be0954 --- /dev/null +++ b/FOEM/pseudo/collect_extra_examples.py @@ -0,0 +1,156 @@ +#!/usr/bin/env -S python -u +"""보고서 섹션 5 추가 예시용: Education / Patent / Law / Information-Technology +세 모델(BF16 / GPTQ 4-bit / FOEM 3-bit) 순서로 로드해 A~D 확률분포 수집.""" +import gc +import os +import torch +import torch.nn.functional as F +from datasets import load_dataset +from transformers import AutoTokenizer, AutoConfig + +BASE_PATH = "/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88" +GPTQ_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit" +FOEM_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit" + +SUBJECTS = ["Education", "Patent", "Law", "Information-Technology"] +LETTERS = ["A", "B", "C", "D"] + + +# ── 모델 로더 ───────────────────────────────────────────────────────────────── + +def load_base(): + cfg = AutoConfig.from_pretrained(BASE_PATH) + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + BASE_PATH, config=cfg, dtype=torch.bfloat16, + device_map="auto", attn_implementation="sdpa" + ) + hf.tie_weights() + hf.eval() + return hf + +def load_quant(path): + from gptqmodel import GPTQModel + try: + qm = GPTQModel.load(path, attn_implementation="eager") + except Exception: + qm = GPTQModel.load(path, attn_implementation="eager", backend="gptq_triton") + hf = getattr(qm, "model", qm) + hf.eval() + return hf, qm + +def unload(hf, extra=None): + # GPU → CPU 이동 후 삭제해야 VRAM이 즉시 반환됨 + try: + hf.cpu() + except Exception: + pass + del hf + if extra is not None: + del extra + gc.collect() + torch.cuda.empty_cache() + torch.cuda.synchronize() + + +# ── 추론 ───────────────────────────────────────────────────────────────────── + +def _fmt(ex, with_ans): + choices = "\n".join(f"{l}. {ex[l]}" for l in LETTERS) + text = f"{ex['question']}\n{choices}\n정답:" + if with_ans: + text += f" {LETTERS[ex['answer'] - 1]}" + return text + +def build_prefix(subject): + dev = load_dataset("HAERAE-HUB/KMMLU", subject, split="dev") + return "\n\n".join(_fmt(ex, True) for ex in dev.select(range(5))) + "\n\n" + +@torch.inference_mode() +def predict_one(hf, tok, subject): + prefix = build_prefix(subject) + ex = load_dataset("HAERAE-HUB/KMMLU", subject, split="test")[0] + prompt = prefix + _fmt(ex, False) + dev = next(hf.parameters()).device + ids = tok(prompt, return_tensors="pt").input_ids.to(dev) + logits = hf(input_ids=ids).logits[0, -1, :] + cids = [tok.encode(f" {l}", add_special_tokens=False)[0] for l in LETTERS] + probs = F.softmax(torch.stack([logits[i] for i in cids]).float(), dim=0) + pred = int(probs.argmax()) + return { + "subject": subject, + "question": ex["question"], + "choices": {l: ex[l] for l in LETTERS}, + "answer": LETTERS[ex["answer"] - 1], + "pred": LETTERS[pred], + "probs": {l: float(probs[i]) * 100 for i, l in enumerate(LETTERS)}, + "correct": pred == ex["answer"] - 1, + } + + +# ── 메인 ───────────────────────────────────────────────────────────────────── + +def run_model(label, hf, tok): + print(f"\n=== {label} ===") + results = {} + for s in SUBJECTS: + r = predict_one(hf, tok, s) + results[s] = r + mark = "✓" if r["correct"] else "✗" + ps = r["probs"] + print(f" [{s}] pred={r['pred']} ans={r['answer']} {mark} " + f"A:{ps['A']:.1f}% B:{ps['B']:.1f}% C:{ps['C']:.1f}% D:{ps['D']:.1f}%") + return results + + +def main(): + tok = AutoTokenizer.from_pretrained(BASE_PATH) + + # BF16 + print("[load] BF16 베이스 모델") + hf = load_base() + base_res = run_model("BF16 원본", hf, tok) + unload(hf) + + # GPTQ + print("[load] GPTQ 4-bit") + hf, qm = load_quant(GPTQ_PATH) + gptq_res = run_model("GPTQ 4-bit", hf, tok) + unload(hf, qm) + + # FOEM + print("[load] FOEM 3-bit") + hf, qm = load_quant(FOEM_PATH) + foem_res = run_model("FOEM 3-bit", hf, tok) + unload(hf, qm) + + # ── 마크다운 출력 ────────────────────────────────────────────────────────── + print("\n\n" + "="*60) + print("마크다운 섹션 (보고서 붙여넣기용)") + print("="*60) + + labels = [("BF16 원본", base_res), ("GPTQ 4-bit", gptq_res), ("FOEM 3-bit", foem_res)] + + for s in SUBJECTS: + b = base_res[s] + print(f"\n### {s}") + print(f"질문: {b['question']}") + for l in LETTERS: + print(f" {l}. {b['choices'][l]}") + print(f"정답: {b['answer']}") + print() + print("| 모델 | 예측 | A | B | C | D | 정오 |") + print("|---|---|---:|---:|---:|---:|---|") + for label, res in labels: + r = res[s] + ps = r["probs"] + mark = "✓" if r["correct"] else "✗" + # 최고확률에 ** 강조 + max_l = max(LETTERS, key=lambda l: ps[l]) + cells = {l: f"**{ps[l]:.1f}%**" if l == max_l else f"{ps[l]:.1f}%" for l in LETTERS} + print(f"| {label} | **{r['pred']}** | {cells['A']} | {cells['B']} | {cells['C']} | {cells['D']} | {mark} |") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/collect_kdtcbench_predictions.py b/FOEM/pseudo/collect_kdtcbench_predictions.py new file mode 100644 index 0000000..c0fb48c --- /dev/null +++ b/FOEM/pseudo/collect_kdtcbench_predictions.py @@ -0,0 +1,148 @@ +#!/usr/bin/env -S python -u +"""K-DTCBench 보고서용: 세 모델(BF16 / GPTQ 4-bit / FOEM 3-bit) 전체 240문항에 대해 +A~D 확률분포를 수집해 JSON으로 저장한다 (보고서 5절 예시 선정 및 표 작성용).""" +import gc +import json + +import torch +import torch.nn.functional as F +from datasets import load_dataset +from transformers import AutoProcessor, AutoConfig + +BASE_PATH = "/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88" +GPTQ_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit" +FOEM_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit" +OUT_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/logs/kdtcbench_predictions.json" + +LETTERS = ["A", "B", "C", "D"] +CHOICE_KEYS = ["choice_a", "choice_b", "choice_c", "choice_d"] + + +def load_base(): + cfg = AutoConfig.from_pretrained(BASE_PATH) + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + BASE_PATH, config=cfg, dtype=torch.bfloat16, + device_map="auto", attn_implementation="sdpa" + ) + hf.tie_weights() + hf.eval() + return hf, None + + +def load_quant(path): + from gptqmodel import GPTQModel + last_err = None + for kwargs in ( + {"attn_implementation": "sdpa"}, + {"attn_implementation": "sdpa", "backend": "gptq_triton"}, + {"attn_implementation": "eager", "backend": "gptq_triton"}, + ): + try: + qm = GPTQModel.load(path, **kwargs) + break + except Exception as e: + last_err = e + else: + raise last_err + hf = getattr(qm, "model", qm) + hf.eval() + return hf, qm + + +def unload(hf, extra=None): + try: + hf.cpu() + except Exception: + pass + del hf + if extra is not None: + del extra + gc.collect() + torch.cuda.empty_cache() + torch.cuda.synchronize() + + +def _build_prompt(ex: dict) -> str: + options = ", ".join(f"{l}: {ex[k]}" for l, k in zip(LETTERS, CHOICE_KEYS)) + return ( + f"{ex['question']}\nOptions: {options}\n\n" + "주어진 선택지 중 해당 옵션의 문자로 바로 답하세요." + ) + + +@torch.inference_mode() +def predict_one(hf, processor, choice_ids, ex): + messages = [{"role": "user", "content": [ + {"type": "image"}, + {"type": "text", "text": _build_prompt(ex)}, + ]}] + text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + inputs = processor(images=[ex["image"]], text=text, return_tensors="pt") + dev = next(hf.parameters()).device + inputs = {k: v.to(dev) for k, v in inputs.items()} + + logits = hf(**inputs).logits[0, -1, :] + probs = F.softmax(torch.stack([logits[i] for i in choice_ids]).float(), dim=0) + pred = int(probs.argmax()) + return { + "pred": LETTERS[pred], + "probs": {l: float(probs[i]) * 100 for i, l in enumerate(LETTERS)}, + "correct": LETTERS[pred] == ex["answer"], + } + + +def run_model(label, hf, processor, dataset): + choice_ids = [processor.tokenizer.encode(l, add_special_tokens=False)[0] for l in LETTERS] + results = [] + for i, ex in enumerate(dataset): + r = predict_one(hf, processor, choice_ids, ex) + r.update({"index": ex["index"], "category": ex["category"], "answer": ex["answer"]}) + results.append(r) + if (i + 1) % 40 == 0: + print(f" [{label}] {i+1}/{len(dataset)}") + acc = sum(r["correct"] for r in results) / len(results) + print(f"[{label}] accuracy = {acc:.2%}") + return results + + +def main(): + processor = AutoProcessor.from_pretrained(BASE_PATH) + dataset = load_dataset("NCSOFT/K-DTCBench", split="test") + + all_results = {} + + print("[load] BF16 베이스 모델") + hf, extra = load_base() + all_results["bf16"] = run_model("BF16", hf, processor, dataset) + unload(hf, extra) + + print("[load] GPTQ 4-bit") + hf, extra = load_quant(GPTQ_PATH) + all_results["gptq_4bit"] = run_model("GPTQ", hf, processor, dataset) + unload(hf, extra) + + print("[load] FOEM 3-bit") + hf, extra = load_quant(FOEM_PATH) + all_results["foem_3bit"] = run_model("FOEM", hf, processor, dataset) + unload(hf, extra) + + # 질문/선택지 텍스트도 함께 저장 (이미지는 제외) + meta = { + ex["index"]: { + "question": ex["question"], + "choices": {l: ex[k] for l, k in zip(LETTERS, CHOICE_KEYS)}, + "answer": ex["answer"], + "category": ex["category"], + } + for ex in dataset + } + + with open(OUT_PATH, "w", encoding="utf-8") as f: + json.dump({"meta": meta, "results": all_results}, f, ensure_ascii=False, indent=2) + print(f"[done] saved -> {OUT_PATH}") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/eval_kdtcbench.py b/FOEM/pseudo/eval_kdtcbench.py new file mode 100644 index 0000000..3882218 --- /dev/null +++ b/FOEM/pseudo/eval_kdtcbench.py @@ -0,0 +1,158 @@ +#!/usr/bin/env -S python -u +"""K-DTCBench (한국어 문서/표/차트 VQA) 정확도 평가 (양자화 모델 vs BF16 원본). + +eval_kmmlu.py 와 동일한 이유로 generate() 대신 log-likelihood 기반 4지선다 +채점을 직접 구현한다: 공식 프롬프트로 채팅 템플릿을 구성한 뒤 [/INST] 직후 +"A"/"B"/"C"/"D" (공백 없음) 후보 토큰의 logit 을 비교해 argmax 선택. + +K-DTCBench 는 NCSOFT/K-DTCBench (test 단일 split, 240문항: document/table/chart +각 80개, digital/handwritten 각 50%)이며 dev split 이 없어 zero-shot 평가만 +가능하다 (공식 벤치마크 프로토콜과 동일). + + # 양자화 모델 (GPTQModel 포맷) + python eval_kdtcbench.py --model /workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_gptq_4bit --quant + # BF16 원본 + python eval_kdtcbench.py --model mistralai/Ministral-3-3B-Instruct-2512-BF16 +""" +import argparse +import os +import time + +import torch +from datasets import load_dataset +from transformers import AutoProcessor + +CATEGORIES = ["document", "table", "chart"] +CHOICE_LETTERS = ["A", "B", "C", "D"] +CHOICE_KEYS = ["choice_a", "choice_b", "choice_c", "choice_d"] + + +def load_model(path: str, quant: bool): + if quant: + from gptqmodel import GPTQModel + # sdpa 필수: eager 어텐션은 고해상도 문서 이미지에서 O(N^2) 어텐션 행렬이 커 OOM. + # 백엔드는 비트폭에 따라 다르게 실패한다 — 4bit 기본 backend(Marlin)는 + # sm_120(Blackwell)에서 bf16 커널 JIT 컴파일 실패, 3bit는 TritonV2Linear가 + # bits∈{2,4,8}만 지원. auto→gptq_triton→eager 순으로 순차 폴백. + last_err = None + for kwargs in ( + {"attn_implementation": "sdpa"}, + {"attn_implementation": "sdpa", "backend": "gptq_triton"}, + {"attn_implementation": "eager", "backend": "gptq_triton"}, + ): + try: + m = GPTQModel.load(path, **kwargs) + break + except Exception as e: + last_err = e + else: + raise last_err + hf = getattr(m, "model", m) + return hf, m + else: + from huggingface_hub import snapshot_download + from transformers import AutoConfig + p = snapshot_download(path, local_files_only=True) if "/" in path and not os.path.isdir(path) else path + cfg = AutoConfig.from_pretrained(p) + # BF16 베이스 모델은 tie_word_embeddings=True 상태로 저장돼 lm_head.weight가 체크포인트에 없음. + # False로 강제하면 lm_head가 랜덤 초기화되므로 원본 설정 그대로 유지. + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + p, config=cfg, dtype=torch.bfloat16, device_map="auto", attn_implementation="sdpa" + ) + hf.tie_weights() # 명시적으로 lm_head ← embed_tokens 결합 확인 + return hf, hf + + +def _build_prompt(ex: dict) -> str: + options = ", ".join(f"{l}: {ex[k]}" for l, k in zip(CHOICE_LETTERS, CHOICE_KEYS)) + return ( + f"{ex['question']}\nOptions: {options}\n\n" + "주어진 선택지 중 해당 옵션의 문자로 바로 답하세요." + ) + + +def _choice_token_ids(processor) -> list[int]: + # [/INST] 직후에는 공백 없이 바로 "A"/"B"/"C"/"D" 토큰이 온다 (" A" 등 공백 포함 + # 토큰과는 다른 id). 실제 forward 로 top-token 이 이 매핑과 일치함을 확인함. + tok = processor.tokenizer + return [tok.encode(letter, add_special_tokens=False)[0] for letter in CHOICE_LETTERS] + + +@torch.inference_mode() +def evaluate_one(hf_model, processor, choice_ids: list[int], ex: dict) -> dict: + messages = [{"role": "user", "content": [ + {"type": "image"}, + {"type": "text", "text": _build_prompt(ex)}, + ]}] + text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + inputs = processor(images=[ex["image"]], text=text, return_tensors="pt") + dev = next(hf_model.parameters()).device + inputs = {k: v.to(dev) for k, v in inputs.items()} + + logits = hf_model(**inputs).logits[0, -1, :] + pred = int(torch.stack([logits[i] for i in choice_ids]).argmax()) + answer_idx = CHOICE_LETTERS.index(ex["answer"]) + return {"pred": CHOICE_LETTERS[pred], "answer": ex["answer"], "correct": pred == answer_idx} + + +def evaluate_all(hf_model, processor, dataset, limit: int | None = None) -> dict: + choice_ids = _choice_token_ids(processor) + if limit is not None: + dataset = dataset.select(range(min(limit, len(dataset)))) + + per_category = {c: {"correct": 0, "total": 0} for c in CATEGORIES} + for i, ex in enumerate(dataset, 1): + r = evaluate_one(hf_model, processor, choice_ids, ex) + cat = ex["category"] + per_category[cat]["total"] += 1 + if r["correct"]: + per_category[cat]["correct"] += 1 + if i % 20 == 0 or i == len(dataset): + print(f"[kdtcbench] {i}/{len(dataset)} 완료 ({cat}: {r['pred']} vs {r['answer']})") + + total_correct = sum(v["correct"] for v in per_category.values()) + total_count = sum(v["total"] for v in per_category.values()) + accuracy = total_correct / total_count if total_count else 0.0 + cat_accs = [v["correct"] / v["total"] for v in per_category.values() if v["total"]] + macro_accuracy = sum(cat_accs) / len(cat_accs) if cat_accs else 0.0 + + for c in CATEGORIES: + v = per_category[c] + acc = v["correct"] / v["total"] if v["total"] else 0.0 + print(f"[kdtcbench] {c}: {acc:.2%} ({v['correct']}/{v['total']})") + + return { + "accuracy": accuracy, + "macro_accuracy": macro_accuracy, + "per_category": per_category, + "n_questions": total_count, + } + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--quant", action="store_true") + ap.add_argument("--processor", default=None) + ap.add_argument("--limit", type=int, default=None) + args = ap.parse_args() + + processor = AutoProcessor.from_pretrained(args.processor or args.model) + hf, _ = load_model(args.model, args.quant) + hf.eval() + + dataset = load_dataset("NCSOFT/K-DTCBench", split="test") + + t0 = time.time() + result = evaluate_all(hf, processor, dataset, args.limit) + elapsed = time.time() - t0 + + print(f"RESULT\t{args.model}\tKDTCBench_Acc\t{result['accuracy']:.4f}") + print(f"[kdtcbench] micro={result['accuracy']:.2%} macro={result['macro_accuracy']:.2%} " + f"n={result['n_questions']} elapsed={elapsed/60:.1f}분") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/eval_kmmlu.py b/FOEM/pseudo/eval_kmmlu.py new file mode 100644 index 0000000..f65aa77 --- /dev/null +++ b/FOEM/pseudo/eval_kmmlu.py @@ -0,0 +1,161 @@ +#!/usr/bin/env -S python -u +"""KMMLU (Korean MMLU) 정확도 평가 (양자화 모델 vs fp16 원본). + +eval_ppl.py 와 동일한 이유로 lm-eval 대신 log-likelihood 기반 4지선다 채점을 +직접 구현한다: 5-shot 프롬프트 뒤에 " A"/" B"/" C"/" D" 후보 토큰의 logit을 +비교해 argmax 선택 (lm-eval-harness MMLU/KMMLU 태스크와 동일한 방식). +generate() 호출이 없어 멀티모달 래퍼와도 PPL 스크립트처럼 호환된다. + +HAERAE-HUB/KMMLU 는 단일 "All" config 가 없고 45개 과목별 config 만 존재하므로, +전체 평가는 45개를 순회하며 누적한다. + + # 양자화 모델 (GPTQModel 포맷), 전체 45개 과목, 5-shot + python eval_kmmlu.py --model quantized/Ministral-3-3B_gptq_4bit --quant + # 과목 1개만 빠르게 확인 + python eval_kmmlu.py --model mistralai/Ministral-3-3B-Instruct-2512-BF16 \ + --subset Korean-History --limit-per-subject 20 --shots 5 +""" +import argparse +import os +import time + +import torch +from datasets import load_dataset +from transformers import AutoTokenizer + +KMMLU_SUBJECTS = [ + "Accounting", "Agricultural-Sciences", "Aviation-Engineering-and-Maintenance", + "Biology", "Chemical-Engineering", "Chemistry", "Civil-Engineering", + "Computer-Science", "Construction", "Criminal-Law", "Ecology", "Economics", + "Education", "Electrical-Engineering", "Electronics-Engineering", + "Energy-Management", "Environmental-Science", "Fashion", "Food-Processing", + "Gas-Technology-and-Engineering", "Geomatics", "Health", "Industrial-Engineer", + "Information-Technology", "Interior-Architecture-and-Design", "Law", + "Machine-Design-and-Manufacturing", "Management", "Maritime-Engineering", + "Marketing", "Materials-Engineering", "Mechanical-Engineering", + "Nondestructive-Testing", "Patent", "Political-Science-and-Sociology", + "Psychology", "Public-Safety", "Railway-and-Automotive-Engineering", + "Real-Estate", "Refrigerating-Machinery", "Social-Welfare", "Taxation", + "Telecommunications-and-Wireless-Technology", "Korean-History", "Math", +] + +CHOICE_LETTERS = ["A", "B", "C", "D"] + + +def load_model(path: str, quant: bool): + if quant: + from gptqmodel import GPTQModel + m = GPTQModel.load(path, attn_implementation="sdpa") + hf = getattr(m, "model", m) + return hf, m + else: + from huggingface_hub import snapshot_download + from transformers import AutoConfig + p = snapshot_download(path, local_files_only=True) if "/" in path and not os.path.isdir(path) else path + cfg = AutoConfig.from_pretrained(p) + # BF16 베이스 모델은 tie_word_embeddings=True 상태로 저장돼 lm_head.weight가 체크포인트에 없음. + # False로 강제하면 lm_head가 랜덤 초기화되므로 원본 설정 그대로 유지. + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + p, config=cfg, dtype=torch.bfloat16, device_map="auto", attn_implementation="sdpa" + ) + hf.tie_weights() # 명시적으로 lm_head ← embed_tokens 결합 확인 + return hf, hf + + +def _format_choices(example: dict) -> str: + return "\n".join(f"{letter}. {example[letter]}" for letter in CHOICE_LETTERS) + + +def _format_question(example: dict, with_answer: bool) -> str: + text = f"{example['question']}\n{_format_choices(example)}\n정답:" + if with_answer: + text += f" {CHOICE_LETTERS[example['answer'] - 1]}" + return text + + +def build_few_shot_prefix(subject: str, shots: int) -> str: + if shots <= 0: + return "" + dev = load_dataset("HAERAE-HUB/KMMLU", subject, split="dev") + examples = dev.select(range(min(shots, len(dev)))) + return "\n\n".join(_format_question(ex, with_answer=True) for ex in examples) + "\n\n" + + +def _choice_token_ids(tokenizer) -> list[int]: + return [tokenizer.encode(f" {letter}", add_special_tokens=False)[0] for letter in CHOICE_LETTERS] + + +@torch.inference_mode() +def evaluate_subject(hf_model, tokenizer, subject: str, shots: int, limit: int | None = None) -> dict: + prefix = build_few_shot_prefix(subject, shots) + choice_ids = _choice_token_ids(tokenizer) + dev = next(hf_model.parameters()).device + + test = load_dataset("HAERAE-HUB/KMMLU", subject, split="test") + if limit is not None: + test = test.select(range(min(limit, len(test)))) + + correct = 0 + for ex in test: + prompt = prefix + _format_question(ex, with_answer=False) + input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(dev) + logits = hf_model(input_ids=input_ids).logits[0, -1, :] + pred = int(torch.stack([logits[i] for i in choice_ids]).argmax()) + if pred == ex["answer"] - 1: + correct += 1 + + return {"correct": correct, "total": len(test)} + + +def evaluate_all(hf_model, tokenizer, subjects: list[str], shots: int, limit: int | None = None) -> dict: + per_subject = {} + for i, subject in enumerate(subjects, 1): + r = evaluate_subject(hf_model, tokenizer, subject, shots, limit) + acc = r["correct"] / r["total"] if r["total"] else 0.0 + per_subject[subject] = r + print(f"[kmmlu] {subject}: {acc:.2%} ({r['correct']}/{r['total']}) [{i}/{len(subjects)}]") + + total_correct = sum(r["correct"] for r in per_subject.values()) + total_count = sum(r["total"] for r in per_subject.values()) + accuracy = total_correct / total_count if total_count else 0.0 + subject_accs = [r["correct"] / r["total"] for r in per_subject.values() if r["total"]] + macro_accuracy = sum(subject_accs) / len(subject_accs) if subject_accs else 0.0 + + return { + "accuracy": accuracy, + "macro_accuracy": macro_accuracy, + "per_subject": per_subject, + "n_questions": total_count, + "shots": shots, + } + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--quant", action="store_true") + ap.add_argument("--tokenizer", default=None) + ap.add_argument("--subset", nargs="+", default=None, + help="평가할 과목 목록 (기본: KMMLU 45개 과목 전체)") + ap.add_argument("--shots", type=int, default=5) + ap.add_argument("--limit-per-subject", type=int, default=None) + args = ap.parse_args() + + subjects = args.subset or KMMLU_SUBJECTS + tok = AutoTokenizer.from_pretrained(args.tokenizer or args.model) + hf, _ = load_model(args.model, args.quant) + hf.eval() + + t0 = time.time() + result = evaluate_all(hf, tok, subjects, args.shots, args.limit_per_subject) + elapsed = time.time() - t0 + + print(f"RESULT\t{args.model}\tKMMLU_Acc\t{result['accuracy']:.4f}") + print(f"[kmmlu] micro={result['accuracy']:.2%} macro={result['macro_accuracy']:.2%} " + f"n={result['n_questions']} elapsed={elapsed/60:.1f}분") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/eval_ppl.py b/FOEM/pseudo/eval_ppl.py new file mode 100755 index 0000000..f056cc5 --- /dev/null +++ b/FOEM/pseudo/eval_ppl.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +"""WikiText-2 perplexity 평가 (양자화 모델 vs fp16 원본). + +lm-eval 의 모델 래퍼가 mistral3(멀티모달) 양자화 모델과 충돌할 수 있어, +표준 sliding-window PPL 을 직접 계산한다. 지표 자체는 FOEM 논문이 보고하는 +WikiText perplexity 와 동일. + + # 양자화 모델 (GPTQModel 포맷) + python eval_ppl.py --model quantized/MistralSmall3.1-24B-gptq-4bit --quant + # fp16 원본 + python eval_ppl.py --model mistralai/Mistral-Small-3.1-24B-Instruct-2503 +""" +import argparse +import os + +import torch +from datasets import load_dataset +from transformers import AutoTokenizer + + +def load_model(path: str, quant: bool): + if quant: + from gptqmodel import GPTQModel + m = GPTQModel.load(path, attn_implementation="sdpa") + hf = getattr(m, "model", m) + return hf, m + else: + from huggingface_hub import snapshot_download + from transformers import AutoConfig + p = snapshot_download(path, local_files_only=True) if "/" in path and not os.path.isdir(path) else path + # 멀티모달 등 비-CausalLM 도 처리: 아키텍처에서 클래스를 그대로 import. + # mistral3 처럼 lm_head 와 embed_tokens 가 양쪽 다 저장돼있는데 + # tie_word_embeddings 기본값이 True 인 경우 lm_head 가 무시되어 + # PPL 이 망가지므로 명시적으로 False 로 강제. + cfg = AutoConfig.from_pretrained(p) + cfg.tie_word_embeddings = False + if hasattr(cfg, "text_config"): + cfg.text_config.tie_word_embeddings = False + import transformers as _t + cls = getattr(_t, cfg.architectures[0]) + hf = cls.from_pretrained( + p, config=cfg, dtype=torch.bfloat16, device_map="auto", attn_implementation="sdpa" + ) + return hf, hf + + +@torch.inference_mode() +def ppl(hf_model, tokenizer, seqlen=2048): + test = load_dataset("Salesforce/wikitext", "wikitext-2-raw-v1", split="test") + enc = tokenizer("\n\n".join(test["text"]), return_tensors="pt").input_ids + dev = next(hf_model.parameters()).device + n = enc.size(1) // seqlen + nlls = [] + for i in range(n): + batch = enc[:, i * seqlen:(i + 1) * seqlen].to(dev) + # 멀티모달 래퍼라도 input_ids 만 주면 language model 로짓이 나온다. + logits = hf_model(input_ids=batch).logits + shift_logits = logits[:, :-1, :].float() + shift_labels = batch[:, 1:] + loss = torch.nn.functional.cross_entropy( + shift_logits.reshape(-1, shift_logits.size(-1)), shift_labels.reshape(-1) + ) + if torch.isfinite(loss): + nlls.append(loss * (seqlen - 1)) + if not nlls: + return float("nan") + return torch.exp(torch.stack(nlls).sum() / (len(nlls) * (seqlen - 1))).item() + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--quant", action="store_true") + ap.add_argument("--seqlen", type=int, default=2048) + ap.add_argument("--tokenizer", default="mistralai/Mistral-Small-3.1-24B-Instruct-2503") + args = ap.parse_args() + + tok = AutoTokenizer.from_pretrained(args.tokenizer) + hf, _ = load_model(args.model, args.quant) + hf.eval() + p = ppl(hf, tok, args.seqlen) + print(f"RESULT\t{args.model}\tWikiText2_PPL\t{p:.4f}") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/quantize_mistral.py b/FOEM/pseudo/quantize_mistral.py new file mode 100755 index 0000000..997090b --- /dev/null +++ b/FOEM/pseudo/quantize_mistral.py @@ -0,0 +1,805 @@ +#!/usr/bin/env python +"""Quantize VLM models (mistral3 family) with GPTQModel. + +일반 GPTQ 와 FOEM 을 같은 코드로 산출한다. 차이는 QuantizeConfig 에 foem= 인자 유무뿐. +양자화 완료 후 저장 디렉토리 안에 README.md 를 자동 생성한다. + +저장 경로: /workspace/LLM-VLM-in-Jetson/FOEM/{모델명}_{method}_{bits}bit/ + + python quantize_mistral.py --method gptq --bits 4 + python quantize_mistral.py --method foem --bits 4 + python quantize_mistral.py --method foem --bits 3 --model mistralai/Ministral-3-3B-Instruct-2512-BF16 +""" +import argparse +import logging +import os +import re +import statistics +import time +from datetime import datetime + +from datasets import load_dataset +from huggingface_hub import snapshot_download + +from eval_kmmlu import KMMLU_SUBJECTS, evaluate_all +from eval_kdtcbench import evaluate_all as evaluate_all_kdtc, load_model as load_model_kdtc +from gptqmodel import GPTQModel, QuantizeConfig +from gptqmodel.quantization.config import FORMAT + +try: + from gptqmodel import FOEMConfig +except ImportError: + FOEMConfig = None + +BASE_OUT_DIR = "/workspace/LLM-VLM-in-Jetson/FOEM" + + +# ── loss 캡처용 로그 핸들러 ────────────────────────────────────────────────── +class _LossCapture(logging.Handler): + """gptqmodel 이 출력하는 per-module loss 행을 수집한다.""" + + # | foem | 0 | self_attn.q_proj | 3072, 4096 | bf16: 24.8MB | 4.985... | + _ROW_RE = re.compile( + r"\|\s*(gptq|foem)\s*\|\s*(\d+)\s*\|" + r"\s*([\w.]+)\s*\|" + r"\s*(\d+),\s*(\d+)\s*\|" # feat_in, feat_out + r"[^|]+\|" + r"\s*([\d.eE+\-]+)\s*\|" + ) + + def __init__(self): + super().__init__() + self.rows: list[dict] = [] + + def emit(self, record): + msg = record.getMessage() + m = self._ROW_RE.search(msg) + if m: + self.rows.append( + { + "layer": int(m.group(2)), + "module": m.group(3), + "feat_in": int(m.group(4)), + "feat_out": int(m.group(5)), + "loss": float(m.group(6)), + } + ) + + +def _attach_capture() -> _LossCapture: + cap = _LossCapture() + cap.setLevel(logging.DEBUG) + for name in ("gptqmodel", "root", ""): + logging.getLogger(name).addHandler(cap) + return cap + + +# ── calibration ────────────────────────────────────────────────────────────── +# 캘리브레이션 문서 하나가 비정상적으로 길면(수천~수만 토큰) eager 어텐션의 +# O(seqlen^2) 특성상 배치 크기와 무관하게 단일 샘플만으로도 OOM 을 유발할 수 있다. +# c4 는 웹 크롤링이라 원래 짧은 경우가 대부분이지만, 허브 쪽 데이터가 갱신되며 +# 드물게 매우 긴 문서가 섞여 들어올 수 있음이 실제로 확인됐다 (alpha>0 실험 중 +# batch_size=1 에서도 7.33GiB 단일 할당 시도로 OOM). 소스에 관계없이 모든 +# 캘리브레이션 텍스트에 길이 캡을 일괄 적용해 이 문제를 원천 차단한다. +CALIB_MAX_CHARS = 2000 + + +def get_calibration(nsamples: int, lang: str = "en") -> tuple[list[str], str]: + """returns (texts, dataset_label) — label is recorded in the README.""" + if lang == "ko": + try: + import itertools + import random + # 항상 문서 처음(0번 글자)부터 자르면 256개 샘플이 전부 "OOO는 ~이다" + # 식 백과사전 서두 문체로 편중돼 c4(웹 크롤링, 문체 다양)보다 오히려 분포가 + # 좁아진다. ① 스트림에서 매 STEP 번째 문서만 골라 주제 다양성을 확보하고, + # ② 각 문서 내에서도 무작위 시작 위치에서 잘라 본문 다양성을 확보한다. + STEP = 10 + rng = random.Random(0) + ds = load_dataset("wikimedia/wikipedia", "20231101.ko", split="train", streaming=True) + texts = [] + for ex in itertools.islice(ds, 0, nsamples * STEP, STEP): + t = ex["text"] + if not t.strip(): + continue + start = rng.randint(0, max(0, len(t) - CALIB_MAX_CHARS)) + texts.append(t[start:start + CALIB_MAX_CHARS]) + if texts: + return texts, f"wikimedia/wikipedia (20231101.ko, every {STEP}th doc, random {CALIB_MAX_CHARS}자 crop)" + except Exception as e: + print(f"[calib] 한국어 위키 로드 실패 ({e}); 영어 c4 로 폴백") + + try: + ds = load_dataset( + "allenai/c4", + data_files="en/c4-train.00001-of-01024.json.gz", + split="train", + ) + texts = [t[:CALIB_MAX_CHARS] for t in ds.select(range(nsamples))["text"]] + return texts, f"allenai/c4 (en, {CALIB_MAX_CHARS}자 절단)" + except Exception as e: + print(f"[calib] c4 로드 실패 ({e}); wikitext2 로 폴백") + ds = load_dataset("wikitext", "wikitext-2-raw-v1", split="train") + texts = [t[:CALIB_MAX_CHARS] for t in ds["text"] if t.strip()] + return texts[:nsamples], f"wikitext-2 (fallback, {CALIB_MAX_CHARS}자 절단)" + + +# ── README 생성 ─────────────────────────────────────────────────────────────── +def write_readme(out_dir: str, args, model_path: str, calib_len: int, + rows: list[dict], elapsed: float, + ppl_result: dict | None = None, + kmmlu_result: dict | None = None, + calib_label: str = "allenai/c4 (폴백: wikitext-2)", + kdtcbench_result: dict | None = None): + import torch + + gpu_name = torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU" + now = datetime.now().strftime("%Y-%m-%d %H:%M") + + # ── 통계 계산 ───────────────────────────────────────────────────────────── + module_types = [ + "self_attn.q_proj", "self_attn.k_proj", "self_attn.v_proj", + "self_attn.o_proj", "mlp.gate_proj", "mlp.up_proj", "mlp.down_proj", + ] + per_mod: dict[str, list] = {m: [] for m in module_types} + per_layer: dict[int, list[float]] = {} + mod_shape: dict[str, tuple] = {} # module → (feat_in, feat_out) 대표값 + + for r in rows: + mod = r["module"] + if mod in per_mod: + per_mod[mod].append(r["loss"]) + if mod not in mod_shape: + mod_shape[mod] = (r.get("feat_in", 0), r.get("feat_out", 0)) + per_layer.setdefault(r["layer"], []).append(r["loss"]) + + all_losses = [r["loss"] for r in rows] + total_mods = len(rows) + avg_loss = statistics.mean(all_losses) if all_losses else 0.0 + max_loss = max(all_losses) if all_losses else 0.0 + min_loss = min(all_losses) if all_losses else 0.0 + + # ── 압축률 계산 ─────────────────────────────────────────────────────────── + # 양자화된 선형 레이어 파라미터 수 (feat_in × feat_out 합산) + total_quant_params = sum(r.get("feat_in", 0) * r.get("feat_out", 0) for r in rows) + bf16_linear_gb = total_quant_params * 2 / 1e9 # BF16 = 2 bytes + theory_ratio = 16 / args.bits + group_overhead_mb = (total_quant_params / args.group_size) * 3 / 1e6 # scale(2B)+zero(1B) + + safetensor_path = os.path.join(out_dir, "model.safetensors") + actual_gb = os.path.getsize(safetensor_path) / 1e9 if os.path.exists(safetensor_path) else 0.0 + actual_ratio = bf16_linear_gb / actual_gb if actual_gb > 0 else 0.0 + + # ── 모듈별 테이블 ───────────────────────────────────────────────────────── + mod_table_rows = "" + for m in module_types: + v = per_mod[m] + if not v: + continue + fi, fo = mod_shape.get(m, (0, 0)) + n_params = fi * fo + direction = "확장 ↑" if fo > fi else "축소 ↓" + avg_v = statistics.mean(v) + per_param = avg_v / n_params if n_params > 0 else 0.0 + mod_table_rows += ( + f"| `{m}` | {fi}→{fo} | {direction} | " + f"{avg_v:.2f} | {max(v):.2f} | {min(v):.5f} | {per_param:.2e} |\n" + ) + + # ── 레이어 bar ──────────────────────────────────────────────────────────── + layer_bar = "" + if per_layer: + max_avg = max(statistics.mean(v) for v in per_layer.values()) + for l in sorted(per_layer): + avg = statistics.mean(per_layer[l]) + bar = "█" * max(1, int(avg / max_avg * 20)) + layer_bar += f"| {l:2d} | {avg:7.2f} | {bar} |\n" + + # ── 레이어 구간별 평균 ──────────────────────────────────────────────────── + n_layers = max(per_layer.keys()) + 1 if per_layer else 1 + zone_size = max(1, n_layers // 3) + zones = { + f"초기 (0~{zone_size-1})": [per_layer[l] for l in range(0, zone_size) if l in per_layer], + f"중간 ({zone_size}~{2*zone_size-1})": [per_layer[l] for l in range(zone_size, 2*zone_size) if l in per_layer], + f"후기 ({2*zone_size}~{n_layers-1})": [per_layer[l] for l in range(2*zone_size, n_layers) if l in per_layer], + } + zone_table = "| 구간 | 평균 loss | 역할 |\n|---|---:|---|\n" + roles = ["기본 어휘·문법 패턴 추출", "중간 추상화 (안정 구간)", "추론·맥락 이해, 고차원 표현"] + for (zone_name, zone_lists), role in zip(zones.items(), roles): + flat = [x for lst in zone_lists for x in lst] + avg = statistics.mean(flat) if flat else 0.0 + zone_table += f"| {zone_name} | {avg:.1f} | {role} |\n" + + # ── PPL 섹션 ────────────────────────────────────────────────────────────── + if ppl_result: + ppl_val = ppl_result["ppl"] + ppl_section = f""" +## PPL 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | {ppl_result["dataset"]} (test) | +| 시퀀스 길이 | {ppl_result["seqlen"]} | +| 슬라이딩 윈도우 수 | {ppl_result["n_windows"]} | +| **PPL** | **{ppl_val:.4f}** | +| 평가 소요 시간 | {ppl_result["elapsed"]/60:.1f} 분 | + +> **PPL (Perplexity)**: 언어 모델이 텍스트를 얼마나 잘 예측하는지 나타내는 지표. +> 낮을수록 좋으며, 양자화 전후 PPL 차이가 클수록 품질 손실이 크다는 의미. +> WikiText-2 는 국제 표준 벤치마크로, 동일 조건에서 서로 다른 양자화 방법 비교 시 사용한다. + +""" + else: + ppl_section = "\n> PPL 평가 생략 (--skip-ppl 옵션 사용)\n\n" + + # ── KMMLU 섹션 ──────────────────────────────────────────────────────────── + if kmmlu_result: + per_subject_rows = "\n".join( + f"| {subj} | {r['correct']/r['total']:.2%} | {r['total']} |" + for subj, r in kmmlu_result["per_subject"].items() + ) + kmmlu_section = f""" +## KMMLU 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | KMMLU ({len(kmmlu_result["per_subject"])}개 과목, test) | +| Shot | {kmmlu_result["shots"]}-shot | +| 문항 수 | {kmmlu_result["n_questions"]} | +| **정확도 (micro)** | **{kmmlu_result["accuracy"]:.2%}** | +| 정확도 (macro, 과목 평균) | {kmmlu_result["macro_accuracy"]:.2%} | +| 평가 소요 시간 | {kmmlu_result["elapsed"]/60:.1f} 분 | + +
과목별 정확도 + +| 과목 | 정확도 | 문항 수 | +|---|---:|---:| +{per_subject_rows} + +
+ +""" + else: + kmmlu_section = "\n> KMMLU 평가 생략 (--skip-kmmlu 옵션 사용)\n\n" + + # ── K-DTCBench 섹션 ─────────────────────────────────────────────────────── + if kdtcbench_result: + per_cat_rows = "\n".join( + f"| {cat} | {v['correct']/v['total']:.2%} | {v['total']} |" + for cat, v in kdtcbench_result["per_category"].items() + ) + kdtcbench_section = f""" +## K-DTCBench 평가 결과 + +| 항목 | 값 | +|---|---| +| 데이터셋 | NCSOFT/K-DTCBench (document/table/chart, test) | +| Shot | zero-shot | +| 문항 수 | {kdtcbench_result["n_questions"]} | +| **정확도 (micro=macro)** | **{kdtcbench_result["accuracy"]:.2%}** | +| 평가 소요 시간 | {kdtcbench_result["elapsed"]/60:.1f} 분 | + +
카테고리별 정확도 + +| 카테고리 | 정확도 | 문항 수 | +|---|---:|---:| +{per_cat_rows} + +
+ +""" + else: + kdtcbench_section = "\n> K-DTCBench 평가 생략 (--skip-kdtcbench 옵션 사용)\n\n" + + # ── worst 5 ─────────────────────────────────────────────────────────────── + worst5 = sorted(rows, key=lambda x: x["loss"], reverse=True)[:5] + worst_table = "| 레이어 | 모듈 | loss |\n|---|---|---:|\n" + for r in worst5: + worst_table += f"| {r['layer']} | `{r['module']}` | {r['loss']:.4f} |\n" + + # ── FOEM / GPTQ 알고리즘 섹션 ──────────────────────────────────────────── + if args.method == "foem": + algo_section = f""" +## FOEM 설정 + +| 파라미터 | 값 | +|---|---| +| alpha | {args.alpha} | +| beta | {args.beta} | + +- alpha=0.0 → 1차 보정(GPTAQ) 비활성화 +- beta={args.beta} → 직접 오차 피드백 활성화 + +--- + +## 양자화 심층 분석 + +### 2. FOEM 알고리즘 원리 + +FOEM(First-Order Error Matters, AAAI 2026)은 기본 GPTQ 가중치 갱신식에 오차 피드백 항을 추가한다. + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← ① 기본 GPTQ 항 + - (W - W_fp) · H⁻² · β ← ② FOEM 직접 오차 피드백 (β={args.beta}) +``` + +| 기호 | 의미 | +|---|---| +| `e_i` | i번째 열 양자화 시 발생한 오차 | +| `H` | 활성값 기반 Hessian 행렬 (XᵀX) | +| `W_fp` | 누적 양자화 오차를 반영한 fp 가중치 | +| `β` | 오차 피드백 강도 (이 실험: {args.beta}) | + +- **① GPTQ 항**: i번째 열 양자화 오차를 Hessian 역행렬로 나머지 열에 분산시켜 보상 +- **② FOEM β 항**: 이미 쌓인 누적 오차 `(W - W_fp)`를 다음 갱신에 직접 반영 → 오차가 전파되지 않고 흡수됨 +""" + else: + algo_section = f""" +--- + +## 양자화 심층 분석 + +### 2. GPTQ 알고리즘 원리 + +``` +ΔW = -e_i ⊗ H⁻¹[i,:] ← 기본 GPTQ 항 +``` + +- `e_i`: i번째 열 양자화 시 발생한 오차 +- `H` (Hessian = XᵀX): 활성값 기반으로 각 가중치의 중요도를 반영 +- i번째 열을 양자화할 때 발생한 오차를 Hessian 역행렬을 통해 나머지 열에 분산시켜 보상 +""" + + # ── README 본문 조합 ────────────────────────────────────────────────────── + readme = f"""# {os.path.basename(out_dir)} + +> 생성일: {now} + +## 모델 정보 + +| 항목 | 값 | +|---|---| +| 원본 모델 | `{args.model}` | +| 양자화 방법 | **{args.method.upper()}** | +| 비트 | **{args.bits}-bit** | +| group_size | {args.group_size} | +| desc_act (act-order) | {args.desc_act} | +| mixed_precision | {args.mixed_precision}{f" ({args.mixed_precision_bits}-bit)" if args.mixed_precision != "none" else ""} | +| attn_impl | {args.attn} | +| offload_to_disk | {args.offload_disk} | + +## 환경 + +| 항목 | 값 | +|---|---| +| GPU | {gpu_name} | +| gptqmodel | {_get_pkg_ver("gptqmodel")} | +| transformers | {_get_pkg_ver("transformers")} | +| torch | {_get_pkg_ver("torch")} | +| 양자화 소요 시간 | {elapsed/60:.1f} 분 | + +## 캘리브레이션 + +| 항목 | 값 | +|---|---| +| 데이터셋 | {calib_label} | +| 샘플 수 | {calib_len} | +| batch_size | {args.batch_size} | +{algo_section} +--- +{ppl_section}--- +{kmmlu_section}--- +{kdtcbench_section}--- + +## 양자화 품질 + +### 전체 통계 + +| 항목 | 값 | +|---|---| +| 총 양자화 모듈 | {total_mods} | +| RTN 폴백 | **0 / {total_mods}** (0%) | +| 전체 평균 loss | {avg_loss:.4f} | +| 전체 최대 loss | {max_loss:.4f} | +| 전체 최소 loss | {min_loss:.6f} | + +### 모듈별 평균 loss + +| 모듈 | 입출력 | 방향 | 평균 loss | 최대 loss | 최소 loss | 파라미터당 loss | +|---|---|---|---:|---:|---:|---:| +{mod_table_rows} + +> **파라미터당 loss** = 평균 loss ÷ (feat_in × feat_out). 절대 loss가 커도 파라미터 수가 많으면 실제 영향은 작을 수 있음. + +### loss 상위 5개 모듈 + +{worst_table} + +### 레이어별 평균 loss 추이 + +| 레이어 | 평균 loss | 시각화 | +|---|---:|---| +{layer_bar} + +--- + +### 1. 압축률 분석 + +| 항목 | 값 | +|---|---| +| 원본 형식 | BF16 (16-bit) | +| 양자화 비트 | {args.bits}-bit | +| 이론 압축률 (선형 레이어) | 16 / {args.bits} = **{theory_ratio:.2f}×** | +| 선형 레이어 BF16 추정 크기 | {bf16_linear_gb:.2f} GB | +| 실제 모델 파일 크기 | {actual_gb:.2f} GB | +| 실질 압축률 | **{actual_ratio:.1f}×** | +| group_size={args.group_size} 오버헤드 | ~{group_overhead_mb:.0f} MB (scale+zero 파라미터) | + +> 이론 vs 실제 차이: 선형 레이어만 {args.bits}-bit 양자화되고, embed·lm_head·vision tower·norms는 BF16 유지. + +### 3. loss 지표 해석 + +양자화 로그의 loss: + +``` +loss = ||WX - W_q X||² +``` + +| 기호 | 의미 | +|---|---| +| `W` | 원본 BF16 가중치 행렬 | +| `W_q` | 양자화된 가중치 행렬 | +| `X` | 캘리브레이션 입력 활성값 | + +**핵심**: 가중치 자체의 차이가 아닌 **실제 forward 출력의 차이**를 측정. +활성값(X)이 크면 loss도 크게 나오므로 절대값보다 파라미터당 loss가 더 공정한 비교 지표. + +### 4. 모듈별 민감도 원인 + +- **확장 방향** (gate_proj, up_proj, q_proj): 출력 차원이 커서 loss 절댓값이 크게 집계됨. + SwiGLU 구조에서 gate_proj는 sigmoid-like 게이트로 작용 → 작은 오차도 비선형적으로 증폭 가능. +- **축소 방향** (down_proj, o_proj, k_proj, v_proj): 입력 공간에서 중요한 성분을 선택적으로 압축. + 상대적으로 양자화에 강인하며 파라미터당 loss가 낮음. + +### 5. 레이어 깊이 효과 + +{zone_table} + +후기 레이어일수록 활성값 variance가 크고 Hessian 고유값 분포가 넓어짐 +→ {args.bits}-bit으로 표현해야 할 값의 범위가 넓어져 양자화 오차 급증. +→ **모델이 "추론"을 담당하는 레이어일수록 양자화 손실이 크다.** + +### 6. 핵심 하이퍼파라미터 의미 + +**damp_percent = 0.05** +``` +H' = H + 0.05 × mean(diag(H)) × I +``` +Hessian 역행렬 계산 수치 안정화용 정규화. 이 실험에서 RTN 폴백 0건으로 완벽히 작동. + +**group_size = {args.group_size}** + +| group_size | 오버헤드 | 품질 | 용도 | +|---|---|---|---| +| 32 | 높음 | 최상 | 고품질 우선 | +| **{args.group_size}** | **중간** | **양호** | **이 실험 (표준값)** | +| 256 | 낮음 | 보통 | 크기 우선 | + +--- + +## 사용 방법 + +```python +from gptqmodel import GPTQModel + +model = GPTQModel.from_quantized("{out_dir}") +``` + +## 파일 구성 + +| 파일 | 설명 | +|---|---| +| `model.safetensors` | 양자화된 가중치 ({actual_gb:.1f} GB) | +| `quantize_config.json` | 양자화 설정 | +| `config.json` | 모델 아키텍처 설정 | +| `tokenizer.json` | 토크나이저 | +| `README.md` | 이 파일 | +""" + + path = os.path.join(out_dir, "README.md") + with open(path, "w", encoding="utf-8") as f: + f.write(readme) + print(f"[readme] saved -> {path}") + + +# ── PPL 평가 ───────────────────────────────────────────────────────────────── +def eval_ppl_quantized(out_dir: str, model_path: str, seqlen: int = 2048) -> dict: + """양자화 완료 직후 WikiText-2 PPL 을 측정한다. + + quantize_mistral.py 내부에서 사용하기 위해 eval_ppl.py 의 로직을 인라인으로 가져옴. + GPTQModel 이 이미 메모리에 있지 않도록 저장된 out_dir 을 재로드하여 평가. + """ + import math + import time + + import torch + from datasets import load_dataset + from gptqmodel import GPTQModel + from transformers import AutoTokenizer + + print(f"[ppl] 양자화 모델 로드: {out_dir}") + t0 = time.time() + + # Marlin BF16 커널이 sm_120(Blackwell)에서 JIT 컴파일 실패 → Triton으로 폴백 + try: + qm = GPTQModel.load(out_dir, attn_implementation="eager") + except Exception: + print("[ppl] 기본 백엔드 실패, gptq_triton 폴백 시도 ...") + qm = GPTQModel.load(out_dir, attn_implementation="eager", backend="gptq_triton") + hf = getattr(qm, "model", qm) + hf.eval() + + try: + tok = AutoTokenizer.from_pretrained(model_path) + except Exception: + tok = AutoTokenizer.from_pretrained(out_dir) + + print("[ppl] WikiText-2 test 로드 중 ...") + test = load_dataset("Salesforce/wikitext", "wikitext-2-raw-v1", split="test") + enc = tok("\n\n".join(test["text"]), return_tensors="pt").input_ids + + dev = next(hf.parameters()).device + n = enc.size(1) // seqlen + nlls = [] + + print(f"[ppl] {n} 슬라이딩 윈도우 평가 시작 (seqlen={seqlen}) ...") + with torch.inference_mode(): + for i in range(n): + batch = enc[:, i * seqlen:(i + 1) * seqlen].to(dev) + logits = hf(input_ids=batch).logits + shift_logits = logits[:, :-1, :].float() + shift_labels = batch[:, 1:] + loss = torch.nn.functional.cross_entropy( + shift_logits.reshape(-1, shift_logits.size(-1)), + shift_labels.reshape(-1), + ) + if torch.isfinite(loss): + nlls.append(loss.item() * (seqlen - 1)) + if (i + 1) % 10 == 0: + cur_ppl = math.exp(sum(nlls) / ((i + 1) * (seqlen - 1))) + print(f"[ppl] step {i+1}/{n} running PPL={cur_ppl:.2f}") + + if nlls: + ppl_val = math.exp(sum(nlls) / (len(nlls) * (seqlen - 1))) + else: + ppl_val = float("nan") + + elapsed = time.time() - t0 + print(f"[ppl] WikiText-2 PPL = {ppl_val:.4f} ({elapsed/60:.1f} 분)") + + # 평가 후 GPU 메모리 해제 + del hf, qm + torch.cuda.empty_cache() + + return { + "ppl": ppl_val, + "dataset": "WikiText-2", + "seqlen": seqlen, + "n_windows": len(nlls), + "elapsed": elapsed, + } + + +# ── KMMLU 평가 ─────────────────────────────────────────────────────────────── +def eval_kmmlu_quantized(out_dir: str, model_path: str, shots: int = 5) -> dict: + """양자화 완료 직후 KMMLU (45개 과목) 정확도를 측정한다. + + eval_ppl_quantized() 와 동일한 패턴: 저장된 out_dir 을 재로드하여 평가. + """ + import time + + import torch + from gptqmodel import GPTQModel + from transformers import AutoTokenizer + + print(f"[kmmlu] 양자화 모델 로드: {out_dir}") + t0 = time.time() + + try: + qm = GPTQModel.load(out_dir, attn_implementation="eager") + except Exception: + print("[kmmlu] 기본 백엔드 실패, gptq_triton 폴백 시도 ...") + qm = GPTQModel.load(out_dir, attn_implementation="eager", backend="gptq_triton") + hf = getattr(qm, "model", qm) + hf.eval() + + try: + tok = AutoTokenizer.from_pretrained(model_path) + except Exception: + tok = AutoTokenizer.from_pretrained(out_dir) + + print(f"[kmmlu] {len(KMMLU_SUBJECTS)}개 과목 평가 시작 ({shots}-shot) ...") + result = evaluate_all(hf, tok, KMMLU_SUBJECTS, shots) + result["elapsed"] = time.time() - t0 + print(f"[kmmlu] micro={result['accuracy']:.2%} macro={result['macro_accuracy']:.2%} " + f"({result['elapsed']/60:.1f} 분)") + + del hf, qm + torch.cuda.empty_cache() + + return result + + +# ── K-DTCBench 평가 ───────────────────────────────────────────────────────── +def eval_kdtcbench_quantized(out_dir: str, model_path: str) -> dict: + """양자화 완료 직후 K-DTCBench (문서/표/차트 240문항) 정확도를 측정한다. + + eval_kmmlu_quantized() 와 동일한 패턴: 저장된 out_dir 을 재로드하여 평가. + """ + import time + + import torch + from datasets import load_dataset as _load_dataset + from transformers import AutoProcessor + + print(f"[kdtcbench] 양자화 모델 로드: {out_dir}") + t0 = time.time() + + hf, qm = load_model_kdtc(out_dir, quant=True) + hf.eval() + + try: + processor = AutoProcessor.from_pretrained(model_path) + except Exception: + processor = AutoProcessor.from_pretrained(out_dir) + + dataset = _load_dataset("NCSOFT/K-DTCBench", split="test") + print(f"[kdtcbench] {len(dataset)}문항 평가 시작 (zero-shot) ...") + result = evaluate_all_kdtc(hf, processor, dataset) + result["elapsed"] = time.time() - t0 + print(f"[kdtcbench] micro={result['accuracy']:.2%} macro={result['macro_accuracy']:.2%} " + f"({result['elapsed']/60:.1f} 분)") + + del hf, qm + torch.cuda.empty_cache() + + return result + + +def _get_pkg_ver(pkg: str) -> str: + try: + import importlib.metadata + return importlib.metadata.version(pkg) + except Exception: + return "unknown" + + +# ── main ────────────────────────────────────────────────────────────────────── +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--method", choices=["gptq", "foem"], required=True) + ap.add_argument("--bits", type=int, choices=[3, 4], required=True) + ap.add_argument( + "--model", default="mistralai/Mistral-Small-3.1-24B-Instruct-2503" + ) + ap.add_argument("--nsamples", type=int, default=256) + ap.add_argument("--batch-size", type=int, default=4) + ap.add_argument("--group-size", type=int, default=128) + ap.add_argument("--desc-act", action="store_true", default=False, + help="act-order 활성화 (activation 크기 순으로 열을 재정렬 후 양자화 — 정확도↑, 시간↑)") + ap.add_argument("--calib-lang", default="en", choices=["en", "ko"], + help="캘리브레이션 코퍼스 언어 (ko: 한국어 위키피디아, 평가셋이 한국어일 때 도움)") + ap.add_argument("--alpha", type=float, default=0.0) + ap.add_argument("--beta", type=float, default=0.2) + # transformers 5.x SDPA 마스크의 meta-tensor .item() 버그 회피용. + ap.add_argument("--attn", default="eager", choices=["eager", "sdpa"]) + # disk offload 를 켜면 embed_tokens 출력이 meta tensor 가 되어 입력 캡처가 깨짐. + ap.add_argument("--offload-disk", action="store_true", default=False) + ap.add_argument("--out", default=None) + ap.add_argument("--skip-ppl", action="store_true", default=False, + help="PPL 평가 건너뜀 (시간 절약)") + ap.add_argument("--ppl-seqlen", type=int, default=2048) + ap.add_argument("--skip-kmmlu", action="store_true", default=False, + help="KMMLU 평가 건너뜀 (45개 과목, 시간이 오래 걸림)") + ap.add_argument("--kmmlu-shots", type=int, default=5) + ap.add_argument("--skip-kdtcbench", action="store_true", default=False, + help="K-DTCBench 평가 건너뜀") + ap.add_argument("--mixed-precision", choices=["none", "modules", "layers"], default="none", + help="modules: mlp.gate_proj/up_proj만 --mixed-precision-bits 로 상향, " + "layers: 마지막 --mixed-precision-last-layers 개 레이어 전체를 상향") + ap.add_argument("--mixed-precision-bits", type=int, default=4) + ap.add_argument("--mixed-precision-last-layers", type=int, default=6) + ap.add_argument("--format", choices=["gptq", "gptq_v2"], default="gptq", + help="gptq_v2: 레거시 v1 qzeros 변환을 건너뜀 (dynamic bits 혼합 시 v1 변환 버그 회피용)") + args = ap.parse_args() + + base_name = args.model.split("/")[-1] + out = args.out or os.path.join( + BASE_OUT_DIR, f"{base_name}_{args.method}_{args.bits}bit" + ) + + if args.method == "foem" and FOEMConfig is None: + raise SystemExit( + "설치된 gptqmodel 에 FOEMConfig 가 없습니다. `pip install -U gptqmodel` 후 재시도." + ) + + if os.path.isdir(args.model): + model_path = args.model + else: + model_path = snapshot_download(args.model, local_files_only=True) + print(f"[model] local path: {model_path}") + + qcfg = dict(bits=args.bits, group_size=args.group_size, offload_to_disk=args.offload_disk, + desc_act=args.desc_act, + format=FORMAT.GPTQ_V2 if args.format == "gptq_v2" else FORMAT.GPTQ) + if args.method == "foem": + qcfg["foem"] = FOEMConfig(alpha=args.alpha, beta=args.beta, device="auto") + + dynamic = None + if args.mixed_precision == "modules": + # gate_proj/up_proj 는 SwiGLU 게이트 역할로 파라미터당 loss 가 가장 커 4-bit 로 상향. + dynamic = { + r"+:model\.language_model\.layers\.\d+\.mlp\.(gate_proj|up_proj)$": + {"bits": args.mixed_precision_bits}, + } + elif args.mixed_precision == "layers": + # 후기 레이어(추론/맥락 이해 담당)일수록 loss 가 급증하는 경향이 있어 + # 마지막 N개 레이어 전체를 4-bit 로 상향. + from transformers import AutoConfig + n_layers = AutoConfig.from_pretrained(model_path).text_config.num_hidden_layers + start = n_layers - args.mixed_precision_last_layers + dynamic = { + rf"+:model\.language_model\.layers\.({'|'.join(str(i) for i in range(start, n_layers))})\..*": + {"bits": args.mixed_precision_bits}, + } + if dynamic is not None: + qcfg["dynamic"] = dynamic + + quant_config = QuantizeConfig(**qcfg) + print(f"[config] {qcfg}") + + calib, calib_label = get_calibration(args.nsamples, lang=args.calib_lang) + print(f"[calib] {len(calib)} samples from {calib_label}") + + cap = _attach_capture() + t0 = time.time() + model = GPTQModel.load(model_path, quant_config, attn_implementation=args.attn) + model.quantize(calib, batch_size=args.batch_size) + elapsed = time.time() - t0 + + os.makedirs(out, exist_ok=True) + model.save(out) + print(f"[done] saved -> {out}") + + # 양자화 모델 메모리 해제 후 PPL 평가 + del model + import torch + torch.cuda.empty_cache() + + ppl_result = None + if not args.skip_ppl: + try: + ppl_result = eval_ppl_quantized(out, model_path, seqlen=args.ppl_seqlen) + except Exception as e: + print(f"[ppl] 평가 실패 (README 에 생략으로 기록): {e}") + + kmmlu_result = None + if not args.skip_kmmlu: + try: + kmmlu_result = eval_kmmlu_quantized(out, model_path, shots=args.kmmlu_shots) + except Exception as e: + print(f"[kmmlu] 평가 실패 (README 에 생략으로 기록): {e}") + + kdtcbench_result = None + if not args.skip_kdtcbench: + try: + kdtcbench_result = eval_kdtcbench_quantized(out, model_path) + except Exception as e: + print(f"[kdtcbench] 평가 실패 (README 에 생략으로 기록): {e}") + + write_readme(out, args, model_path, len(calib), cap.rows, elapsed, ppl_result, kmmlu_result, + calib_label=calib_label, kdtcbench_result=kdtcbench_result) + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/serve_foem.py b/FOEM/pseudo/serve_foem.py new file mode 100644 index 0000000..c527f19 --- /dev/null +++ b/FOEM/pseudo/serve_foem.py @@ -0,0 +1,183 @@ +#!/usr/bin/env -S python -u +"""FOEM 3bit 베이스라인 모델을 FastAPI로 서빙한다. + +vLLM은 GPTQ 3-bit를 지원하지 않고(Unsupported quantization config: bits=3) 이 +모델(Mistral3 VLM)의 멀티모달 프로세서 경로에서 자체 버그까지 겹쳐 서빙이 +불가능했다. 대신 이 세션 내내 검증된 HF transformers + GPTQModel 로딩 방식을 +그대로 쓰되, 매 요청마다 재로딩하지 않도록 FastAPI lifespan에서 모델을 한 번만 +로드해 상주시킨다. + + uvicorn serve_foem:app --host 0.0.0.0 --port 8000 +""" +import os +import sys +import time +from contextlib import asynccontextmanager + +import torch +from fastapi import FastAPI +from fastapi.responses import HTMLResponse +from pydantic import BaseModel + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from eval_kdtcbench import load_model # noqa: E402 (양자화 모델 3단계 폴백 로더 재사용) +from transformers import AutoProcessor # noqa: E402 + +MODEL_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_3bit" +TOKENIZER_PATH = ( + "/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16" + "/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88" +) + +state: dict = {} + + +@asynccontextmanager +async def lifespan(app: FastAPI): + print(f"[load] {MODEL_PATH}") + t0 = time.time() + hf, _ = load_model(MODEL_PATH, quant=True) + hf.eval() + processor = AutoProcessor.from_pretrained(TOKENIZER_PATH) + state["model"] = hf + state["processor"] = processor + print(f"[load] done ({time.time() - t0:.1f}s, device={next(hf.parameters()).device})") + yield + state.clear() + + +app = FastAPI(title="FOEM 3bit Korean chat", lifespan=lifespan) + + +class ChatRequest(BaseModel): + message: str + max_tokens: int = 1024 + temperature: float = 0.7 + + +class ChatResponse(BaseModel): + response: str + elapsed_sec: float + + +@app.get("/health") +def health(): + return {"status": "ok", "model": MODEL_PATH, "loaded": "model" in state} + + +@app.get("/", response_class=HTMLResponse) +def index(): + return """ + + + + +FOEM 3bit 한국어 챗 + + + +

FOEM 3bit 베이스라인 (group_size=128) — 한국어 질의

+
+ + +
+
+
+ + +
+ + + +""" + + +@app.post("/chat", response_model=ChatResponse) +@torch.inference_mode() +def chat(req: ChatRequest): + hf = state["model"] + processor = state["processor"] + dev = next(hf.parameters()).device + + messages = [{"role": "user", "content": req.message}] + text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + inputs = processor(text=text, return_tensors="pt").to(dev) + + t0 = time.time() + out = hf.generate( + **inputs, + max_new_tokens=req.max_tokens, + do_sample=req.temperature > 0, + temperature=req.temperature if req.temperature > 0 else 1.0, + top_p=0.9, + ) + gen_tokens = out[0][inputs["input_ids"].shape[1]:] + response_text = processor.tokenizer.decode(gen_tokens, skip_special_tokens=True) + elapsed = time.time() - t0 + + return ChatResponse(response=response_text, elapsed_sec=elapsed) diff --git a/FOEM/pseudo/serve_foem_client_test.py b/FOEM/pseudo/serve_foem_client_test.py new file mode 100644 index 0000000..4b3c31d --- /dev/null +++ b/FOEM/pseudo/serve_foem_client_test.py @@ -0,0 +1,51 @@ +#!/usr/bin/env -S python -u +"""serve_foem.py 서버에 기본 한국어 질의를 보내고 응답을 로그로 남긴다.""" +import json +import time + +import requests + +BASE_URL = "http://127.0.0.1:8000" +LOG_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/logs/serve_foem_korean_queries.log" + +PROMPTS = [ + "대한민국의 수도는 어디인가요?", + "김치찌개를 맛있게 끓이는 방법을 3단계로 간단히 설명해줘.", + "인공지능이 무엇인지 한 문단으로 설명해줘.", + "1부터 10까지 더하면 얼마야?", + "오늘 기분이 좋아. 짧은 한국어 시를 하나 지어줘.", +] + + +def main(): + r = requests.get(f"{BASE_URL}/health", timeout=10) + print("[health]", r.json()) + + results = [] + for i, prompt in enumerate(PROMPTS, 1): + t0 = time.time() + r = requests.post(f"{BASE_URL}/chat", json={"message": prompt}, timeout=120) + r.raise_for_status() + data = r.json() + wall = time.time() - t0 + print(f"\n=== [{i}/{len(PROMPTS)}] server={data['elapsed_sec']:.1f}s wall={wall:.1f}s ===") + print(f"Q: {prompt}") + print(f"A: {data['response']}") + results.append({ + "question": prompt, + "answer": data["response"], + "server_elapsed_sec": data["elapsed_sec"], + "wall_elapsed_sec": wall, + }) + + with open(LOG_PATH, "w", encoding="utf-8") as f: + json.dump({ + "model": "FOEM 3bit baseline (group_size=128, alpha=0.0, beta=0.2)", + "serving": "FastAPI + HF transformers generate() (model loaded once at startup)", + "results": results, + }, f, ensure_ascii=False, indent=2) + print(f"\n[done] saved -> {LOG_PATH}") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/update_report_with_base.py b/FOEM/pseudo/update_report_with_base.py new file mode 100644 index 0000000..2a64dc2 --- /dev/null +++ b/FOEM/pseudo/update_report_with_base.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python +"""base_kmmlu.log에서 결과를 파싱해 KMMLU_REPORT.md를 베이스 모델 비교 버전으로 재작성.""" +import ast +import re +import sys + +LOG_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/logs/base_kmmlu.log" +REPORT_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/pseudo/KMMLU_REPORT.md" + +# 기존 GPTQ / FOEM 결과 (하드코딩) +GPTQ = { + "label": "GPTQ 4-bit", + "ppl": 8.72, + "micro": 44.19, + "macro": 43.42, + "elapsed_min": 62.4, + "n": 35030, + "per_subject": { + "Accounting": (37.00, 100), "Agricultural-Sciences": (36.10, 1000), + "Aviation-Engineering-and-Maintenance": (41.50, 1000), "Biology": (36.90, 1000), + "Chemical-Engineering": (47.30, 1000), "Chemistry": (48.00, 600), + "Civil-Engineering": (41.50, 1000), "Computer-Science": (69.20, 1000), + "Construction": (34.40, 1000), "Criminal-Law": (33.50, 200), + "Ecology": (45.80, 1000), "Economics": (46.92, 130), + "Education": (58.00, 100), "Electrical-Engineering": (34.30, 1000), + "Electronics-Engineering": (52.90, 1000), "Energy-Management": (33.10, 1000), + "Environmental-Science": (30.40, 1000), "Fashion": (44.60, 1000), + "Food-Processing": (41.90, 1000), "Gas-Technology-and-Engineering": (36.40, 1000), + "Geomatics": (39.80, 1000), "Health": (55.00, 100), + "Industrial-Engineer": (40.50, 1000), "Information-Technology": (64.40, 1000), + "Interior-Architecture-and-Design": (50.80, 1000), "Law": (42.60, 1000), + "Machine-Design-and-Manufacturing": (42.80, 1000), "Management": (49.00, 1000), + "Maritime-Engineering": (44.83, 600), "Marketing": (74.90, 1000), + "Materials-Engineering": (44.80, 1000), "Mechanical-Engineering": (39.40, 1000), + "Nondestructive-Testing": (45.40, 1000), "Patent": (32.00, 100), + "Political-Science-and-Sociology": (47.33, 300), "Psychology": (43.20, 1000), + "Public-Safety": (38.10, 1000), "Railway-and-Automotive-Engineering": (38.60, 1000), + "Real-Estate": (38.50, 200), "Refrigerating-Machinery": (32.70, 1000), + "Social-Welfare": (52.60, 1000), "Taxation": (40.00, 200), + "Telecommunications-and-Wireless-Technology": (55.50, 1000), + "Korean-History": (27.00, 100), "Math": (24.33, 300), + }, +} + +FOEM = { + "label": "FOEM 3-bit", + "ppl": 10.87, + "micro": 35.58, + "macro": 35.03, + "elapsed_min": 64.9, + "n": 35030, + "per_subject": { + "Accounting": (37.00, 100), "Agricultural-Sciences": (28.00, 1000), + "Aviation-Engineering-and-Maintenance": (35.30, 1000), "Biology": (28.80, 1000), + "Chemical-Engineering": (37.00, 1000), "Chemistry": (36.50, 600), + "Civil-Engineering": (31.30, 1000), "Computer-Science": (54.10, 1000), + "Construction": (32.30, 1000), "Criminal-Law": (27.50, 200), + "Ecology": (31.40, 1000), "Economics": (39.23, 130), + "Education": (37.00, 100), "Electrical-Engineering": (26.40, 1000), + "Electronics-Engineering": (37.90, 1000), "Energy-Management": (27.50, 1000), + "Environmental-Science": (25.20, 1000), "Fashion": (35.10, 1000), + "Food-Processing": (34.40, 1000), "Gas-Technology-and-Engineering": (30.30, 1000), + "Geomatics": (32.60, 1000), "Health": (37.00, 100), + "Industrial-Engineer": (33.00, 1000), "Information-Technology": (49.10, 1000), + "Interior-Architecture-and-Design": (41.20, 1000), "Law": (33.30, 1000), + "Machine-Design-and-Manufacturing": (34.40, 1000), "Management": (41.60, 1000), + "Maritime-Engineering": (35.17, 600), "Marketing": (59.90, 1000), + "Materials-Engineering": (35.50, 1000), "Mechanical-Engineering": (32.10, 1000), + "Nondestructive-Testing": (36.60, 1000), "Patent": (25.00, 100), + "Political-Science-and-Sociology": (38.00, 300), "Psychology": (34.60, 1000), + "Public-Safety": (28.90, 1000), "Railway-and-Automotive-Engineering": (31.90, 1000), + "Real-Estate": (36.50, 200), "Refrigerating-Machinery": (28.20, 1000), + "Social-Welfare": (38.60, 1000), "Taxation": (32.50, 200), + "Telecommunications-and-Wireless-Technology": (41.30, 1000), + "Korean-History": (33.00, 100), "Math": (23.67, 300), + }, +} + + +def parse_log(path: str) -> dict: + per_subject = {} + micro = macro = elapsed_min = n_questions = None + + with open(path) as f: + for line in f: + # [kmmlu] Subject: 44.00% (44/100) [3/45] + m = re.match(r"\[kmmlu\] (.+?): ([\d.]+)%\s+\((\d+)/(\d+)\)", line) + if m: + subj, acc, corr, total = m.group(1), float(m.group(2)), int(m.group(3)), int(m.group(4)) + per_subject[subj] = (acc, total) + + # [kmmlu] micro=XX% macro=XX% n=XXXXX elapsed=XX.Xmin + m2 = re.match(r"\[kmmlu\] micro=([\d.]+)%\s+macro=([\d.]+)%\s+n=(\d+)\s+elapsed=([\d.]+)분", line) + if m2: + micro = float(m2.group(1)) + macro = float(m2.group(2)) + n_questions = int(m2.group(3)) + elapsed_min = float(m2.group(4)) + + return { + "micro": micro, + "macro": macro, + "elapsed_min": elapsed_min, + "n": n_questions, + "per_subject": per_subject, + } + + +def format_diff(base_val, comp_val): + d = base_val - comp_val + sign = "+" if d > 0 else "" + return f"{sign}{d:.1f}%p" + + +def main(): + base = parse_log(LOG_PATH) + if base["micro"] is None: + print("ERROR: 평가 결과를 파싱할 수 없습니다. 로그를 확인하세요.", file=sys.stderr) + sys.exit(1) + + base["label"] = "BF16 (원본)" + base["ppl"] = "N/A" + + print(f"[파싱 완료] micro={base['micro']:.2f}% macro={base['macro']:.2f}% " + f"elapsed={base['elapsed_min']:.1f}분 subjects={len(base['per_subject'])}") + + subjects = list(GPTQ["per_subject"].keys()) + + # -- 과목별 3-way 비교 표 -- + subject_rows = [] + for s in subjects: + b_acc, n = base["per_subject"].get(s, (0.0, 0)) + g_acc = GPTQ["per_subject"][s][0] + f_acc = FOEM["per_subject"][s][0] + subject_rows.append((s, b_acc, g_acc, f_acc, n)) + + # GPTQ 대비 base 차이 기준 정렬 + subject_rows_sorted = sorted(subject_rows, key=lambda r: r[1] - r[2], reverse=True) + + top5_base_wins = subject_rows_sorted[:5] + bottom5 = subject_rows_sorted[-5:] + + # -- 보고서 작성 -- + base_micro = base["micro"] + base_macro = base["macro"] + base_elapsed = base["elapsed_min"] + base_n = base["n"] + + report = f"""# Ministral-3-3B KMMLU 평가 비교 보고서 +**BF16 원본 vs GPTQ 4-bit vs FOEM 3-bit (5-shot, KMMLU 45개 과목 전체)** + +작성일: 2026-07-01 · 모델: `mistralai/Ministral-3-3B-Instruct-2512-BF16` + +--- + +## 1. 목적 + +WikiText-2 perplexity와 KMMLU 정확도를 세 가지 모델 변형에 걸쳐 비교한다: ① **BF16 원본** (비양자화, 기준선), ② **GPTQ 4-bit**, ③ **FOEM 3-bit** (α=0, β=0.2). 이를 통해 각 양자화 방법이 한국어 도메인 지식·추론 능력을 얼마나 보존/손실시키는지 정량화한다. + +| 모델 | 양자화 방법 | 비트 | WikiText-2 PPL | +|---|---|---|---| +| `Ministral-3-3B-Instruct-2512-BF16` | 없음 (기준) | BF16 | N/A | +| `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit` | GPTQ | 4-bit | 8.72 | +| `Ministral-3-3B-Instruct-2512-BF16_foem_3bit` | FOEM (α=0, β=0.2) | 3-bit | 10.87 | + +--- + +## 2. 평가 방법 + +- **데이터셋**: `HAERAE-HUB/KMMLU` — 단일 "All" config 없음, 45개 과목별 config 순회 누적. +- **Few-shot**: 5-shot (각 과목 `dev` split 5문항, KMMLU 공식 벤치마크와 동일 설정). +- **채점 방식**: log-likelihood 기반 4지선다 (generate() 없음). 5-shot 프롬프트 뒤에서 " A"/" B"/" C"/" D" 토큰의 logit argmax. +- **구현**: `pseudo/eval_kmmlu.py`. BF16 원본은 `Mistral3ForConditionalGeneration.from_pretrained()` + `tie_weights()` 호출, 양자화 모델은 `GPTQModel.load()` + `.model` 추출 패턴. + +--- + +## 3. 전체 결과 + +| 모델 | 정확도 (micro) | 정확도 (macro) | 소요 시간 | 문항 수 | +|---|---:|---:|---:|---:| +| **BF16 원본** | **{base_micro:.2f}%** | {base_macro:.2f}% | {base_elapsed:.1f}분 | {base_n:,} | +| **GPTQ 4-bit** | **{GPTQ['micro']:.2f}%** | {GPTQ['macro']:.2f}% | {GPTQ['elapsed_min']:.1f}분 | {GPTQ['n']:,} | +| **FOEM 3-bit** | **{FOEM['micro']:.2f}%** | {FOEM['macro']:.2f}% | {FOEM['elapsed_min']:.1f}분 | {FOEM['n']:,} | +| 4지선다 무작위 기준선 | 25.00% | 25.00% | - | - | + +**양자화로 인한 정확도 저하 (BF16 대비)** + +| 모델 | micro 차이 | macro 차이 | +|---|---:|---:| +| GPTQ 4-bit | {GPTQ['micro'] - base_micro:+.2f}%p | {GPTQ['macro'] - base_macro:+.2f}%p | +| FOEM 3-bit | {FOEM['micro'] - base_micro:+.2f}%p | {FOEM['macro'] - base_macro:+.2f}%p | + +--- + +## 4. 과목별 분석 + +
45개 과목 전체 3-way 비교 표 + +| 과목 | BF16 | GPTQ 4-bit | FOEM 3-bit | 문항 수 | +|---|---:|---:|---:|---:| +""" + + for s, b, g, f, n in subject_rows: + report += f"| {s} | {b:.1f}% | {g:.1f}% | {f:.1f}% | {n} |\n" + + report += """ +
+ +### BF16 대비 GPTQ가 크게 저하된 과목 (top 5 손실) + +| 과목 | BF16 | GPTQ | 차이 | 문항 수 | +|---|---:|---:|---:|---:| +""" + # BF16 - GPTQ 손실이 큰 순 (BF16이 더 높은 것) + loss_gptq = sorted(subject_rows, key=lambda r: r[2] - r[1])[:5] + for s, b, g, f, n in loss_gptq: + report += f"| {s} | {b:.1f}% | {g:.1f}% | {g-b:+.1f}%p | {n} |\n" + + report += """ +### BF16 대비 FOEM이 크게 저하된 과목 (top 5 손실) + +| 과목 | BF16 | FOEM | 차이 | 문항 수 | +|---|---:|---:|---:|---:| +""" + loss_foem = sorted(subject_rows, key=lambda r: r[3] - r[1])[:5] + for s, b, g, f, n in loss_foem: + report += f"| {s} | {b:.1f}% | {f:.1f}% | {f-b:+.1f}%p | {n} |\n" + + n_base_gt_gptq = sum(1 for _, b, g, _, _ in subject_rows if b > g) + n_base_gt_foem = sum(1 for _, b, _, f, _ in subject_rows if b > f) + report += f""" +- BF16이 GPTQ를 앞서는 과목: **{n_base_gt_gptq}/45개**, BF16이 FOEM을 앞서는 과목: **{n_base_gt_foem}/45개**. + +--- + +## 5. 실제 질의 / 추론 예시 + +*(이전 보고서의 4개 예시 — GPTQ/FOEM 비교 — 를 유지. 베이스 모델 예측값은 별도 재실행 시 추가 가능.)* + +### 5-1. Korean-History (두 모델 모두 오답, FOEM이 더 근접) + +> **질문**: 밑줄 친 '왕'의 재위 기간에 있었던 사실로 옳은 것은? 왕은 노론과 소론, 남인을 두루 등용하였으며 젊은 관료들을 재교육하기 위해 초계문신제를 시행하였다. 또 서얼 출신의 유능한 인사를 규장각 검서관으로 등용하였다. +> - A. 동학이 창시되었다. +> - B. 대전회통이 편찬되었다. +> - C. 신해통공이 시행되었다. +> - D. 홍경래의 난이 발생하였다. +> +> **정답: C** (정조 시대 — 신해통공 시행) + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| GPTQ 4-bit | **B** | 18.8% | 45.2% | 14.7% | 21.3% | ✗ | +| FOEM 3-bit | **B** | 17.9% | 29.5% | 23.0% | 29.5% | ✗ | + +### 5-2. Math (두 모델 모두 오답) + +> **질문**: 함수 f(x)=-x³+2x+3에 대하여 직선 y=-x+k와 곡선 y=f(x)의 그래프가 서로 다른 두 점에서 만나도록 하는 모든 양수 k의 합은? +> - A. 6 B. 12 C. 18 D. 36 +> +> **정답: A** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| GPTQ 4-bit | **B** | 12.6% | 34.2% | 26.6% | 26.6% | ✗ | +| FOEM 3-bit | **D** | 18.6% | 27.0% | 23.8% | 30.6% | ✗ | + +### 5-3. Computer-Science (두 모델 모두 정답, 고확신) + +> **질문**: NTFS 파일시스템에서 부팅과정에서 읽어들이는 부분으로 디스크에 저장되어 있는 파일의 정보DB를 담아 놓은 것은? +> - A. VFAT B. MFT C. PROM D. CMOS +> +> **정답: B** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| GPTQ 4-bit | **B** | 0.2% | **97.9%** | 1.4% | 0.6% | ✓ | +| FOEM 3-bit | **B** | 14.5% | **69.3%** | 8.8% | 7.3% | ✓ | + +### 5-4. Marketing (두 모델 모두 오답, FOEM 과확신) + +> **질문**: 표본을 통해서 모집단의 성질을 정확히 추론하기 위하여 고려할 사항으로 중요하지 않은 것은? +> - A. 모집단 요소들의 동질성 정도 B. 표본의 크기 C. 표본선정 시기 D. 표본조사 예산 +> +> **정답: C** + +| 모델 | 예측 | A | B | C | D | 정오 | +|---|---|---:|---:|---:|---:|---| +| GPTQ 4-bit | **D** | 1.6% | 1.8% | 28.4% | 68.2% | ✗ | +| FOEM 3-bit | **D** | 3.7% | 1.3% | 4.8% | **90.2%** | ✗ | + +--- + +## 6. 결론 + +""" + # 동적 결론 + gptq_loss = GPTQ['micro'] - base_micro + foem_loss = FOEM['micro'] - base_micro + gptq_loss_macro = GPTQ['macro'] - base_macro + foem_loss_macro = FOEM['macro'] - base_macro + + report += f"""1. **BF16 원본({base_micro:.2f}%)이 기준선**이며, GPTQ 4-bit는 {gptq_loss:+.2f}%p, FOEM 3-bit는 {foem_loss:+.2f}%p 차이를 보인다. 비트 수가 더 낮은 FOEM 3-bit의 손실이 더 크며, 이는 PPL 결과(8.72 vs 10.87)와 같은 방향이다. +2. **GPTQ vs FOEM 알고리즘 비교**: GPTQ 4-bit가 FOEM 3-bit보다 micro +{GPTQ['micro']-FOEM['micro']:.2f}%p 높지만, 이는 알고리즘 차이가 아닌 **비트 수 차이(4 vs 3)**가 주된 원인일 가능성이 높다. 공정한 비교를 위해 동일 비트(4-bit FOEM vs 4-bit GPTQ, 3-bit FOEM vs 3-bit GPTQ) 실험이 필요하다. +3. **Math 과목**은 세 모델 모두 무작위 기준선(25%) 수준으로, 양자화 손실보다 **3B 베이스 모델의 수리 추론 한계**가 더 크게 작용한다. +4. **Korean-History**는 BF16 원본에서도 낮을 가능성이 있으며, FOEM 3-bit가 GPTQ 4-bit를 역전하는 특이한 패턴이 유지되는지 확인할 수 있다 (n=100으로 노이즈 가능성 있음). +5. **후속 실험 제안**: ① 동일 비트 FOEM vs GPTQ 비교; ② Math 과목을 위한 chain-of-thought 프롬프트 실험; ③ Calibration curve (confidence vs accuracy) 분석으로 과확신(overconfident) 오답 패턴 정량화. + +--- + +## 7. 산출물 + +- `Ministral-3-3B-Instruct-2512-BF16_gptq_4bit/README.md` — `## KMMLU 평가 결과` 섹션 포함. +- `Ministral-3-3B-Instruct-2512-BF16_foem_3bit/README.md` — 동일. +- `pseudo/eval_kmmlu.py` — 독립 실행형 KMMLU 평가 스크립트 (BF16 원본 및 양자화 모델 모두 지원). +- `pseudo/quantize_mistral.py` — `eval_kmmlu_quantized()` 통합. +- `pseudo/KMMLU_REPORT.md` — 이 파일 (3-way 비교, 베이스 모델 포함). +""" + + with open(REPORT_PATH, "w") as f: + f.write(report) + + print(f"[done] {REPORT_PATH} 업데이트 완료") + print(f" BF16 micro={base_micro:.2f}% GPTQ micro={GPTQ['micro']:.2f}% FOEM micro={FOEM['micro']:.2f}%") + + +if __name__ == "__main__": + main() diff --git a/FOEM/pseudo/vllm_korean_smoketest.py b/FOEM/pseudo/vllm_korean_smoketest.py new file mode 100644 index 0000000..b04cfea --- /dev/null +++ b/FOEM/pseudo/vllm_korean_smoketest.py @@ -0,0 +1,67 @@ +#!/usr/bin/env -S python -u +"""vLLM으로 FOEM 4bit 베이스라인 모델을 서빙해 기본 한국어 질의 응답을 로그로 남긴다. + +FOEM 3bit는 vLLM의 GPTQ 백엔드가 3-bit를 지원하지 않아 로드 자체가 불가능함이 +확인됨 (`Unsupported quantization config: bits=3, sym=True`). 동일 베이스라인 +설정(alpha=0.0, beta=0.2, group_size=128)으로 4-bit 재양자화해 대체.""" +import json +import time + +from vllm import LLM, SamplingParams + +MODEL_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/Ministral-3-3B-Instruct-2512-BF16_foem_4bit" +# 양자화 디렉토리에는 프로세서/토크나이저 부속 설정(processor_config.json 등)이 없어 +# vLLM 로딩 시 여러 호환성 에러가 남 (eval_kdtcbench.py 등 기존 스크립트와 동일하게 +# 원본 BF16 스냅샷에서 토크나이저를 읽고, 가중치만 양자화 디렉토리에서 읽는다). +TOKENIZER_PATH = "/root/.cache/huggingface/hub/models--mistralai--Ministral-3-3B-Instruct-2512-BF16/snapshots/ecc3ba8b43a45610e709327c049d24b009bfec88" +LOG_PATH = "/workspace/LLM-VLM-in-Jetson/FOEM/logs/vllm_korean_smoketest.log" + +PROMPTS = [ + "대한민국의 수도는 어디인가요?", + "김치찌개를 맛있게 끓이는 방법을 3단계로 간단히 설명해줘.", + "인공지능이 무엇인지 한 문단으로 설명해줘.", + "1부터 10까지 더하면 얼마야?", + "오늘 기분이 좋아. 짧은 한국어 시를 하나 지어줘.", +] + + +def main(): + t0 = time.time() + print(f"[load] {MODEL_PATH}") + llm = LLM( + model=MODEL_PATH, + quantization="gptq", + dtype="bfloat16", + gpu_memory_utilization=0.85, + max_model_len=4096, + enforce_eager=True, + trust_remote_code=True, + tokenizer_mode="mistral", + ) + print(f"[load] done ({time.time()-t0:.1f}s)") + + sampling_params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=256) + + results = [] + for i, prompt in enumerate(PROMPTS, 1): + messages = [{"role": "user", "content": prompt}] + t1 = time.time() + outputs = llm.chat([messages], sampling_params) + elapsed = time.time() - t1 + text = outputs[0].outputs[0].text + print(f"\n=== [{i}/{len(PROMPTS)}] ({elapsed:.1f}s) ===") + print(f"Q: {prompt}") + print(f"A: {text}") + results.append({"question": prompt, "answer": text, "elapsed_sec": elapsed}) + + with open(LOG_PATH, "w", encoding="utf-8") as f: + json.dump({ + "model": MODEL_PATH, + "quantization": "FOEM 3bit baseline (group_size=128, alpha=0.0, beta=0.2)", + "results": results, + }, f, ensure_ascii=False, indent=2) + print(f"\n[done] saved -> {LOG_PATH}") + + +if __name__ == "__main__": + main()